在pandas中展开dataFrame

问题描述 投票:1回答:1

我有一个像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

python performance pandas dataframe rows
1个回答
2
投票

我相信你需要用Seriess创建string,由stackjoin重塑为原始的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转换为lists并通过indexs重复lengthDataFrame创建的新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
© www.soinside.com 2019 - 2024. All rights reserved.