请推荐一种从现有数据帧的每一行创建新数据帧的python方法。
建议必须考虑到现有数据帧的行数是随机的,所以提供的解决方案必须考虑到这一点。(对于下面的示例,原始数据帧包含3行,但是,原始数据帧中的实际行数将是随机的。)原数据框的列将保持不变。
原始dataframe:
import pandas as pd
from numpy.random import randn
df = pd.DataFrame(randn(3,3), columns=['column 1', 'column 2', 'column 3'], index = ['row 1', 'row 2', 'row 3'])
print(df)
输出:
column 1 column 2 column 3
row 1 0.972855 -0.179018 0.177614
row 2 -2.146628 -1.639054 -0.708013
row 3 -1.295298 -0.313462 -0.229140
实现解决方案后的期望输出(如下所示创建了三个新数据帧,保留了原始列):
dataframe 1:
column 1 column 2 column 3
row 1 0.972855 -0.179018 0.177614
dataframe 2:
column 1 column 2 column 3
row 2 -2.146628 -1.639054 -0.708013
dataframe 3:
column 1 column 2 column 3
row 3 -2.146628 -1.639054 -0.708013
我还想保留处理新创建的数据帧的能力,并操纵其中的数据。
我已经尝试通过使用。iterrows函数和使用动态创建的变量来实现我自己的解决方案,但我想知道解决问题的建议,最简单,最优雅的方法是什么。
好的,我认为我找到的解决问题的方法是所有建议中最好的,所以我将在这里分享它:
首先,我们将使用"for"遍历原始数据库的行。循环和itertuples()"函数。在循环中,.itertuples()返回的数据函数用于构造一个新的pandas数据库,然后将其存储在字典中。用于存储每个新创建的数据库的字典键是从".itertuples"函数。
import pandas as pd
from numpy.random import randn
df = pd.DataFrame(randn(3,3), columns=['column 1', 'column 2', 'column 3'], index = ['row 1', 'row 2', 'row 3'])
row = df.itertuples()
my_dict = {}
for row in df.itertuples():
my_dict[row[0]] = pd.DataFrame([list(row)[1:]], columns=['column 1', 'column 2', 'column 3'],
index = [row[0]])
print(my_dict)
输出:
{'row 1': column 1 column 2 column 3
row 1 2.083922 1.513993 0.861644, 'row 2': column 1 column 2 column 3
row 2 0.988185 -0.685701 0.252542, 'row 3': column 1 column 2 column 3
row 3 -0.526314 -1.481147 -1.789547}
这是我能找到的最直接的解决方案。对以上有什么意见吗?(如果有更好的解决方案,我将更改接受的答案。)
您可以使用groupby,并使用全局变量来设置新的数据框架名称。像这样:
import pandas as pd
from numpy.random import randn
df = pd.DataFrame(randn(3,3), columns=['column 1', 'column 2', 'column 3'], index = ['row 1', 'row 2', 'row 3'])
count = 0
for (uniquerow), group in df.groupby(df.index):
count+=1
globals()['df' + str(count)] = group
,其中df1-dfn
现在已经为原始数据框的n行创建。