Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:groupby中的数据帧列表到更小的数据帧列表_Python_Pandas_List_Pandas Groupby - Fatal编程技术网

python:groupby中的数据帧列表到更小的数据帧列表

python:groupby中的数据帧列表到更小的数据帧列表,python,pandas,list,pandas-groupby,Python,Pandas,List,Pandas Groupby,我有许多dfs存储在一个列表(df_列表)中。某些dfs共享相同的列(“b”)。应从列表中提取具有此相同列的dfs,并将其存储到新的数据帧列表中。是否有一种方法可以通过编程方式在列表中“groupby”dfs,以处理更多可能发生这种情况的情况 示例数据和预期输出如下所示。欢迎大家发表意见。非常感谢 示例数据 df1 = pd.DataFrame(data={'id': [1, 2, 3], 'a': [1,2,3], 'b': ['t1','t1','t1']}) df2 = pd.DataFr

我有许多dfs存储在一个列表(df_列表)中。某些dfs共享相同的列(“b”)。应从列表中提取具有此相同列的dfs,并将其存储到新的数据帧列表中。是否有一种方法可以通过编程方式在列表中“groupby”dfs,以处理更多可能发生这种情况的情况

示例数据和预期输出如下所示。欢迎大家发表意见。非常感谢

示例数据

df1 = pd.DataFrame(data={'id': [1, 2, 3], 'a': [1,2,3], 'b': ['t1','t1','t1']})
df2 = pd.DataFrame(data={'id': [10, 11, 12], 'a': [2,3,4], 'b': ['t1','t1','t1']})
df3 = pd.DataFrame(data={'id': [1, 2, 3], 'a': [1,2,3], 'b': ['t2','t2','t2']})
df4 = pd.DataFrame(data={'id': [1, 2, 3], 'a': [1,2,3], 'b': ['t3','t3','t3']})
df5 = pd.DataFrame(data={'id': [10, 11, 12], 'a': [2,3,4], 'b': ['t1','t1','t1']})

df_list = (df1, df2, df3, df4, df5)
预期输出:分组列表

df_list_t1 = (df1, df2, df5)
df_list_t2 = (df3)
df_list_t3 = (df4)

您可以使用
itertools.groupby
对数据帧进行分组:

从itertools导入groupby
out=[]
对于groupby中的g(
排序(df_list,key=lambda k:k[“b”].tolist()),lambda k:k[“b”].tolist())
):
out.追加(列表(g))
#请打印列表:
对于subl in out:
打印(*subl,sep=“\n\n”)
打印(“-”*80)
印刷品:

id a b
01 t1
1 2 t1
2 3 3 t1
身份证
010 2 t1
1113 t1
2 12 4 t1
身份证
010 2 t1
1113 t1
2 12 4 t1
--------------------------------------------------------------------------------
身份证
011t2
1 2 t2
2 3 3 t2
--------------------------------------------------------------------------------
身份证
011T3
1 2 t3
2 3 t3
--------------------------------------------------------------------------------

您可以使用
defaultdict
按如下方式简单地执行此操作:

from collections import defaultdict

dfs = defaultdict(list)

for df in [df1, df2, df3, df4, df5]:
    k = df['b'].unique()[0]
    dfs[k].append(df)

df_list_t1, df_list_t2, df_list_t3 = list(dfs.values())
输出:

>>> df_list_t1
[   id  a   b
0   1  1  t1
1   2  2  t1
2   3  3  t1,    
   id  a   b
0  10  2  t1
1  11  3  t1
2  12  4  t1,    
   id  a   b
0  10  2  t1
1  11  3  t1
2  12  4  t1]
>>>
>>> df_list_t2
[   id  a   b
0   1  1  t2
1   2  2  t2
2   3  3  t2]
>>> 
>>> df_list_t3
[   id  a   b
0   1  1  t3
1   2  2  t3
2   3  3  t3]

[k代表g,k在pd中。concat([df1,df2,df3,df4,df5])。groupby('b')]??正在尝试对相同的dfs进行分组?@nk03非常感谢,它几乎可以工作,但它将b列中包含t1的三个dfs存储为单个dfs,但我更愿意将其作为三个独立数据帧的列表。@DanielButler感谢您的提问,不,它们实际上并不完全相同,但b列中的变量将是相同的,这就是我想要分组的内容。这非常完美,谢谢。我的下一步是只在包含多个数据帧的列表上运行循环。你认为这可以合并到同一个命令中吗?@br101是的,如果你想打印包含多个数据帧的列表,你可以这样做:
if len(subl)>1:…
啊,非常感谢,当然可以!出于好奇,我试图访问存储在列表中的dfs,例如out[1],但我无法访问存储在列表第一个元素(其中b=t1)中的第二个数据帧,除非我事先将其子集。有办法吗?