我有一个像dataFrame
import 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()
迭代dataFrame并使用df.loc()
修改或添加行到newDatafromve似乎非常慢。
如何以更快的方式创建数据框或像current
一样修改new
?
我相信你需要用Series
s创建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
s并通过index
s重复length
为DataFrame
创建的新loc
。最后使用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