python - 在pandas中展开dataFrame

标签 python performance pandas dataframe rows

我有一个像这样的数据框

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/

相关文章:

python - 在主循环旁边运行 Tkinter 相关代码,无需 GUI 卡住

python - JSON 到 Python 数据框

python - 在没有上下文的情况下向当前 channel 发送消息? |重写discord.py

python - 将 lambda 函数用于依赖于输入的函数

c++ - 当我所做的只是将循环代码移动到函数中时,代码运行速度慢了十倍

c++ - 快速生成变量嵌套for循环的数字组合

mysql - 两列索引 (A,B) 和索引 (B) 为常量时的 A 和 B 指南

python - 取决于计算 groupby 对象中两个列单元格之间的差异的列

python - 从 Pandas 数据框中的其他列分配列的值

python - 基本的Python弹跳球问题(可能还有嵌套循环?)