我有一个大熊猫数据框(大约 150000 行)。我尝试过方法 groupby('id') 但在返回组元组中。我只需要一个数据帧列表,然后将它们转换为 np 数组批次以放入自动编码器(例如 https://www.datacamp.com/community/tutorials/autoencoder-keras-tutorial 但 1D)
所以我有一个熊猫数据集:
data = {'Name': ['Tom', 'Joseph', 'Krish', 'John', 'John', 'John', 'John', 'Krish'], 'Age': [20, 21, 19, 18, 18, 18, 18, 18],'id': [1, 1, 2, 2, 3, 3, 3, 3]}
# Create DataFrame
df = pd.DataFrame(data)
# Print the output.
df.head(10)
我需要相同的输出(只是一个熊猫数据框列表)。另外,我需要一个未排序列表的列表,这很重要,因为它是时间序列。
data1 = {'Name': ['Tom', 'Joseph'], 'Age': [20, 21],'id': [1, 1]}
data2 = {'Name': ['Krish', 'John', ], 'Age': [19, 18, ],'id': [2, 2]}
data3 = {'Name': ['John', 'John', 'John', 'Krish'], 'Age': [18, 18, 18, 18],'id': [3, 3, 3, 3]}
pd_1 = pd.DataFrame(data1)
pd_2 = pd.DataFrame(data2)
pd_3 = pd.DataFrame(data3)
array_list = [pd_1,pd_2,pd_3]
array_list
如何拆分数据框?
答案 0 :(得分:5)
或者你可以试试:
array_list = df.groupby(df.id.values).agg(list).to_dict('records')
Output
:
[{'Name': ['Tom', 'Joseph'], 'Age': [20, 21], 'id': [1, 1]},
{'Name': ['Krish', 'John'], 'Age': [19, 18], 'id': [2, 2]},
{'Name': ['John', 'John', 'John', 'Krish'],
'Age': [18, 18, 18, 18],
'id': [3, 3, 3, 3]}]
UPDATE
:
如果您需要数据框列表:
df_list = [g for _,g in df.groupby('id')]
#OR
df_list = [pd.DataFrame(i) for i in df.groupby(df.id.values).agg(list).to_dict('records')]
要重置每个数据帧的索引:
df_list = [g.reset_index(drop=True) for _,g in df.groupby('id')]
答案 1 :(得分:3)
让我们在 group
上 id
并使用 to_dict
和方向 list
为每个 id
准备记录
[g.to_dict('list') for _, g in df.groupby('id', sort=False)]
[{'Name': ['Tom', 'Joseph'], 'Age': [20, 21], 'id': [1, 1]},
{'Name': ['Krish', 'John'], 'Age': [19, 18], 'id': [2, 2]},
{'Name': ['John', 'John', 'John', 'Krish'], 'Age': [18, 18, 18, 18], 'id': [3, 3, 3, 3]}]
答案 2 :(得分:1)
我不确定您的需求,但这样的事情对您有用吗?
df = df.set_index("id")
[df.loc[i].to_dict("list") for i in df.index.unique()]
或者如果您真的想将索引保留在列表中:
[df.query(f"id == {i}").to_dict("list") for i in df.id.unique()]
答案 3 :(得分:0)
如果要创建存储值的新 DataFrame:
(如果您想创建列表,以前的答案更相关)
这可以通过使用 for
循环迭代每个 id 并在每个循环中创建一个新数据帧来解决。
我建议您参阅 #40498463 和其他有关 groupby()
函数用法的答案。请注意,我已将 id 列的名称更改为 Id。
for Id, df in df.groupby("Id"):
str1 = "df"
str2 = str(Id)
new_name = str1 + str2
exec('{} = pd.DataFrame(df)'.format(new_name))
输出:
df1
Name Age Id
0 Tom 20 1
1 Joseph 21 1
df2
Name Age Id
2 Krish 19 2
3 John 18 2
df3
Name Age Id
4 John 18 3
5 John 18 3
6 John 18 3
7 Krish 18 3