python - 如何有效地复制 pandas 行,仅更改一列?

标签 python pandas dataframe

我有一个如下所示的数据框:

    v1  v2
0   a   A1
1   b   A2,A3
2   c   B4
3   d   A5, B6, B7

我想修改此数据框,以便为 v2 中的每个值复制 v2 列中具有多个值的任何行。以上面的dataframe为例,结果如下:

    v1  v2
0   a   A1
1   b   A2
2   b   A3
3   c   B4
4   d   A5
5   d   B6
6   d   B7

我可以使用以下代码来做到这一点:

new_df = pd.DataFrame()
for index, row in df.iterrows():
    if len(row["v2"].split(','))>1:
        row_base = row
        for r in row["v2"].split(','):
            row_base["v2"] = r
            new_df = new_df.append(row_base, ignore_index=True)
    else:
        new_df = new_df.append(row)

然而,在大型数据帧上它效率极低,我想学习如何更有效地做到这一点。

最佳答案

Pandas 0.25+ 版本解决方案 Series.str.splitDataFrame.explode :

df = df.assign(v2 = df.v2.str.split(',')).explode('v2').reset_index(drop=True)
print (df)
  v1  v2
0  a  A1
1  b  A2
2  b  A3
3  c  B4
4  d  A5
5  d  B6
6  d  B7

对于旧版本,numpy 的性能应该会更好:

from itertools import chain

s = df.v2.str.split(',')
lens = s.str.len()
df = pd.DataFrame({
    'v1' : df['v1'].values.repeat(lens),
    'v2' : list(chain.from_iterable(s.values.tolist()))
})
print (df)
  v1  v2
0  a  A1
1  b  A2
2  b  A3
3  c  B4
4  d  A5
5  d  B6
6  d  B7

关于python - 如何有效地复制 pandas 行,仅更改一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58482669/

相关文章:

python - 迭代JSON列表以匹配特定的键值对

python - GDB Python API : Doesn't . parse_and_eval() 使 .cast() 和 .dereference() 变得多余?

python - pandas -- 如何让 Series 听写

python - 如何在不丢失宏的情况下使用 pandas、openpyxl、xlwings 使用宏更新现有的 xlsm 工作表

python-3.x - Pandas .agg() 转换为列表但跳过 nans

python - 对非常大的 Pandas Data frame 进行聚合和统计

python - Unicode解码错误: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)

python - 如何在元组上使用 apply 属性

r - 将选择的列乘以 R 中的另一个选择

python - 连接不满足条件的列