每个 pandas 数据帧切片的元组列表
List of tuples for each pandas dataframe slice
我需要做一些与这个问题非常相似的事情:Pandas convert dataframe to array of tuples
区别在于我不仅需要获取整个 DataFrame 的单个元组列表,还需要获取元组列表的列表,根据某些列值进行切片。
假设这是我的数据集:
t_id A B
----- ---- -----
0 AAAA 1 2.0
1 AAAA 3 4.0
2 AAAA 5 6.0
3 BBBB 7 8.0
4 BBBB 9 10.0
...
我想输出:
[[(1,2.0), (3,4.0), (5,6.0)],[(7,8.0), (9,10.0)]]
即 'AAAA' 的一个列表,'BBBB' 的另一个列表,依此类推。
我试过两个嵌套的 for 循环。它似乎有效,但它花费的时间太长(实际数据集有 ~1M 行):
result = []
for t in df['t_id'].unique():
tuple_list= []
for x in df[df['t_id' == t]].iterrows():
row = x[1][['A', 'B']]
tuple_list.append(tuple(x))
result.append(tuple_list)
有没有更快的方法?
您可以按列 t_id
分组,遍历组并将每个子数据帧转换为元组列表:
[g[['A', 'B']].to_records(index=False).tolist() for _, g in df.groupby('t_id')]
# [[(1, 2.0), (3, 4.0), (5, 6.0)], [(7, 8.0), (9, 10.0)]]
我认为这也应该有效:
import pandas as pd
import itertools
df = pd.DataFrame({"A": [1, 2, 3, 1], "B": [2, 2, 2, 2], "C": ["A", "B", "C", "B"]})
tuples_in_df = sorted(tuple(df.to_records(index=False)), key=lambda x: x[0])
output = [[tuple(x)[1:] for x in group] for _, group in itertools.groupby(tuples_in_df, lambda x: x[0])]
print(output)
输出:
[[(2, 'A'), (2, 'B')], [(2, 'B')], [(2, 'C')]]
我需要做一些与这个问题非常相似的事情:Pandas convert dataframe to array of tuples
区别在于我不仅需要获取整个 DataFrame 的单个元组列表,还需要获取元组列表的列表,根据某些列值进行切片。
假设这是我的数据集:
t_id A B
----- ---- -----
0 AAAA 1 2.0
1 AAAA 3 4.0
2 AAAA 5 6.0
3 BBBB 7 8.0
4 BBBB 9 10.0
...
我想输出:
[[(1,2.0), (3,4.0), (5,6.0)],[(7,8.0), (9,10.0)]]
即 'AAAA' 的一个列表,'BBBB' 的另一个列表,依此类推。
我试过两个嵌套的 for 循环。它似乎有效,但它花费的时间太长(实际数据集有 ~1M 行):
result = []
for t in df['t_id'].unique():
tuple_list= []
for x in df[df['t_id' == t]].iterrows():
row = x[1][['A', 'B']]
tuple_list.append(tuple(x))
result.append(tuple_list)
有没有更快的方法?
您可以按列 t_id
分组,遍历组并将每个子数据帧转换为元组列表:
[g[['A', 'B']].to_records(index=False).tolist() for _, g in df.groupby('t_id')]
# [[(1, 2.0), (3, 4.0), (5, 6.0)], [(7, 8.0), (9, 10.0)]]
我认为这也应该有效:
import pandas as pd
import itertools
df = pd.DataFrame({"A": [1, 2, 3, 1], "B": [2, 2, 2, 2], "C": ["A", "B", "C", "B"]})
tuples_in_df = sorted(tuple(df.to_records(index=False)), key=lambda x: x[0])
output = [[tuple(x)[1:] for x in group] for _, group in itertools.groupby(tuples_in_df, lambda x: x[0])]
print(output)
输出:
[[(2, 'A'), (2, 'B')], [(2, 'B')], [(2, 'C')]]