我正在尝试实现以下内容:我知道如何使用2列,但我需要将其扩展到2列以上。换句话说,var2和var3需要被复制并向下扩展并映射到var1 col中的每个值。
var1 var2 var3
0 47429,47404 10700 1403298300
1 23030,23831,23147 99999 1403297100
试图获得:
var1 var2 var3
0 47429 10700 1403298300
1 47404 10700 1403298300
2 23030 99999 1403297100
3 23831 99999 1403297100
4 23147 99999 1403297100
来自其他帖子的此代码仅使用两列而不是3:
pd.concat([pd.Series(row['var2'], row['var1'].split(','))\
for _, row in testdf.iterrows()]).reset_index()[:5]
答案 0 :(得分:2)
在一个大问题上:
In [107]: df
Out[107]:
var1 var2 var3
0 47429,47404 10700 1403298300
1 23030,23831,23147 99999 1403297100
In [108]: pd.concat((pd.Series((v, row['var2'], row['var3']), df.columns) for _, row in df.iterrows() for v in row['var1'].split(',')), axis=1).T
Out[108]:
var1 var2 var3
0 47429 10700 1403298300
1 47404 10700 1403298300
2 23030 99999 1403297100
3 23831 99999 1403297100
4 23147 99999 1403297100
内部嵌套生成器就是那些诀窍。 他们基本上和这些for循环做同样的工作:
In [112]: for _, row in df.iterrows():
for v in row['var1'].split(","):
print (v, row['var2'], row['var3'])
.....:
('47429', 10700, 1403298300)
('47404', 10700, 1403298300)
('23030', 99999, 1403297100)
('23831', 99999, 1403297100)
('23147', 99999, 1403297100)
我还将原始数据框的列标题添加到生成的Series
。
最后,由于我没有熊猫专家,我解决了沿着轴1连接系列然后转置 数据框以使其处于正确的结构中。