在pandas中展开dataFrame

时间:2017-12-17 20:40:14

标签: python performance pandas dataframe rows

我有一个像

这样的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()对数据框进行迭代,并使用df.loc()修改或添加行到newDatafromve似乎非常慢。

如何以更快的方式创建数据框或修改current之类的new

1 个答案:

答案 0 :(得分:2)

我认为您需要使用Series创建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转换为list,然后index重复lengthDataFrame来创建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