gpt4 book ai didi

python - 如何将 Pandas Dataframe 中的每一行分解为多行

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:53 27 4
gpt4 key购买 nike

我有一个传递 pandas 数据框的函数,对于该数据框中的每一行,我想创建 N 个其他行,除了 2 列值外,每一行都等同于原始行。

执行此操作的正确方法是什么 - 尤其是以 RAM 有效的方式?

到目前为止,我的尝试是运行 pd.apply,然后为每一行调用一个函数,该函数返回一个 pd.Series 对象列表然后将调用 append 将它们添加到原始 DataFrame。不过,这还没有成功。

这是我尝试使用一些虚拟代码来复制的示例:

students = [ ('Jack', 34, 'Sydney' , 'Australia') ,
('Jill', 30, 'New York' , 'USA' ) ]

# Create a DataFrame object
df = pd.DataFrame(students, columns = ['Name' , 'Age', 'City' , 'Country'], index=['a', 'b', 'c' , 'd' , 'e' , 'f'])

# function I will use to explode a single row into 10 new rows
def replicate(x):
new_rows = []
i = 0
for j in range(3):
y = x.copy(deep=True)
y.Age = i
i += 1
new_rows.append(y)
return new_rows

# Iterate over each row and append the results
df.apply(lambda x: df.append(replicate(x))

对于上述内容,我希望输出如下所示:

Jack, 34, Sydney, Australia
Jack, 0, Sydney, Australia
Jack, 1, Sydney, Australia
Jack, 2, Sydney, Australia
Jill, 30, New York, USA
Jill, 0, New York, USA
Jill, 1, New York, USA
Jill, 2, New York, USA

最后,我希望我的数据框有 N 倍的行,我可以在其中从原始行计算派生行。我想以一种节省空间的方式来做这件事,但现在还没有发生。感谢您的帮助!

最佳答案

IIUC,你想要np.repeat,使用Age列指定重复次数,然后在事后修复age列。

import pandas as pd

df1 = pd.DataFrame(df.values.repeat(df.Age+1, axis=0),
columns=['Name', 'Age', 'City', 'Country'])
df1['Age'] = (df1.groupby([*df1]).cumcount()-1).where(df1.duplicated(), df1['Age'])

输出df1:

    Name Age      City    Country
0 Jack 34 Sydney Australia
1 Jack 0 Sydney Australia
2 Jack 1 Sydney Australia
3 Jack 2 Sydney Australia
4 Jack 3 Sydney Australia
...
34 Jack 33 Sydney Australia
35 Jill 30 New York USA
...
63 Jill 27 New York USA
64 Jill 28 New York USA
65 Jill 29 New York USA

[66 rows x 4 columns]

输入df:

   Name  Age      City    Country
a Jack 34 Sydney Australia
b Jill 30 New York USA

关于python - 如何将 Pandas Dataframe 中的每一行分解为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54754619/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com