我有一个像这样的数据框
import pandas as pd
current = pd.DataFrame([{
'a1': 'ab',
'a2': 'value'
}, {
'a1': 'ef',
'a2': 'value'
}])
我需要创建一个如下所示的新数据框。
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看起来非常慢。
如何以更快的方式创建数据帧或修改当前
(如新
)?
最佳答案
我相信您需要使用string
创建Series
,通过stack
reshape 并join
到原始 >数据帧
:
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
并按 length 重复
用于由index
loc
创建的新DataFrame
。最后使用连接
添加新列:
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
关于python - 在pandas中展开dataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47859236/