0

我正在尝试在 IPython 上做一个单行器,但我得到了SyntaxError: invalid syntax. 代码如下:

 for zzz in ddd.index: zzz1 = zzz.split('///'); zzz3 = [zzz2.strip() for zzz2 in zzz1 if len(zzz1) > 1]; for zzz4 in zzz3: ddd.ix[zzz4]['Class'] = ddd.ix[zzz]['Class']; del ddd.ix[zzz]

我可以将其解释为:对于 DataFrame 索引上的每个值,ddd我将其拆分///为分隔符。然后,如果返回多个值,我为每个值创建一行并删除原始行。例如,我有:

             Class
lal          1
eri /// iii  2
aks          3

我想获得

             Class
lal          1
eri          2
iii          2
aks          3

第一列 (`lal', 'eri', ... ) 是数据帧的索引。

我怎样才能做到这一点?我已经搜索了文档,但我没有弄清楚如何去做。

谢谢

4

2 回答 2

2

不确定您要在这里做什么。

In [13]: df
Out[13]: 
             A  B
0          lal  1
1  eri /// iii  2
2          aks  3

这是一个非常长的表达式来做到这一点。好消息是这将很快。

In [56]: split = df['A'].str.split('\s+\/\/\/\s+').apply(Series)

In [57]: split
Out[57]: 
     0    1
0  lal  NaN
1  eri  iii
2  aks  NaN

In [58]: indexed = split.unstack().dropna()

In [59]: indexed
Out[59]: 
0  0    lal
   1    eri
   2    aks
1  1    iii
dtype: object

 In [61]: grouped = indexed.groupby(level=1).apply(
           lambda x: Series(x.values,index=list(x.index.get_level_values(1))))

In [62]: grouped
Out[62]: 
0  0    lal
1  1    eri
   1    iii
2  2    aks
dtype: object

In [63]: grouped.reset_index().set_index('level_1')
Out[63]: 
         level_0    0
level_1              
0              0  lal
1              1  eri
1              1  iii
2              2  aks
于 2013-10-24T14:47:42.673 回答
1

这是@Jeff 的另一端的版本:我认为非常,但很清楚。

index_pairs = [(ind, subind.strip()) for ind in df.index for subind in ind.split("///")]
old_i, new_i = zip(*index_pairs)
df2 = df.ix[list(old_i)]
df2.index = new_i

请注意,这假定原始索引是唯一的


从我们的框架开始:

>>> df
             Class
lal              1
eri /// iii      2
aks              3

根据需要制作一个将原始索引与尽可能多的新子索引连接起来的对列表:

>>> index_pairs = [(ind, subind.strip()) for ind in df.index for subind in ind.split("///")]
>>> index_pairs
[('lal', 'lal'), ('eri /// iii', 'eri'), ('eri /// iii', 'iii'), ('aks', 'aks')]

转置:

>>> old_i, new_i = zip(*index_pairs)
>>> old_i
('lal', 'eri /// iii', 'eri /// iii', 'aks')
>>> new_i
('lal', 'eri', 'iii', 'aks')

使用旧索引来索引df

>>> df2 = df.ix[list(old_i)]
>>> df2
             Class
lal              1
eri /// iii      2
eri /// iii      2
aks              3

重置索引:

>>> df2.index = new_i
>>> df2
     Class
lal      1
eri      2
iii      2
aks      3
于 2013-10-24T15:36:28.900 回答