[英]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.