繁体   English   中英

IPython + Pandas Oneliner无法正常工作

[英]IPython + pandas oneliner not working

我正在尝试在IPython上做一个oneliner,但是我得到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',...)是数据帧的索引。

我该如何实现? 我已经搜索了文档,但没有弄清楚该怎么做。

谢谢

不知道您要在这里做什么。

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

这是与@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM