我有一个像
这样的dataFrameimport pandas as pd
current = pd.DataFrame([{
'a1': 'ab',
'a2': 'value'
}, {
'a1': 'ef',
'a2': 'value'
}])
我需要创建一个新的dataFrame,如下所示。
new = pd.DataFrame([{
'a1': 'ab',
'a2': 'value',
'a1Val': 'a'
}, {
'a1': 'ab',
'a2': 'value',
'a1Val': 'b'
}, {
'a1': 'ef',
'a2': 'value',
'a1Val': 'e'
}, {
'a1': 'ef',
'a2': 'value',
'a1Val': 'f'
}])
使用iterrows()
或itertuples()
对数据框进行迭代,并使用df.loc()
修改或添加行到newDatafromve似乎非常慢。
如何以更快的方式创建数据框或修改current
之类的new
?
答案 0 :(得分:2)
我认为您需要使用Series
创建string
,然后将stack
和join
重新设置为原始DataFrame
:
s = (current['a1'].apply(lambda x: pd.Series(list(x)))
.stack()
.rename('a1val')
.reset_index(level=1, drop=True))
print (s)
0 a
0 b
1 e
1 f
Name: a1val, dtype: object
df = current.join(s).reset_index(drop=True)
print (df)
a1 a2 a1val
0 ab value a
1 ab value b
2 ef value e
3 ef value f
使用numpy
的另一个解决方案,首先将a1
转换为list
,然后index
重复length
个DataFrame
来创建loc
{1}}。上次使用concatenate
添加新列:
s = current['a1'].apply(list)
l = s.str.len()
df = (current.loc[current.index.repeat(l)]
.assign(a1val=np.concatenate(s.values))
.reset_index(drop=True))
print (df)
a1 a2 a1val
0 ab value a
1 ab value b
2 ef value e
3 ef value f