将数据帧拆分为数据帧

2024-06-17 10:54:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个DataFrame,其中不同的行对一个列可以有相同的值。
例如:

import pandas as pd
df = pd.DataFrame( { 
    "Name" : ["Alice", "Bob", "John", "Mark", "Emma" , "Mary"] , 
    "City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] } )

     City       Name
0    Seattle    Alice
1    Seattle    Bob
2    Portland   John
3    Seattle    Mark
4    Seattle    Emma
5    Portland   Mary

在这里,“城市”(例如“波特兰”)的给定值由几行共享。在

我想从这个数据帧创建几个数据帧,这些数据帧具有相同的一列值。对于上面的示例,我希望获得以下数据帧:

^{pr2}$

以及

     City       Name
2    Portland   John
5    Portland   Mary

从这个answer开始,我创建了一个可以用来生成一个数据帧的掩码:

def mask_with_in1d(df, column, val):
    mask = np.in1d(df[column].values, [val])
    return df[mask]

# Return the last data frame above
mask_with_in1d(df, 'City', 'Portland')

问题是要高效地创建所有的数据帧,并为其分配一个名称。我是这样做的:

unique_values = np.sort(df['City'].unique())
for city_value in unique_values:
    exec("df_{0} = mask_with_in1d(df, 'City', '{0}')".format(city_value))

这给了我可以进一步操作的数据帧df_Seattle和{}。在

有更好的方法吗?在


Tags: 数据namecitydataframedfwithmaskjohn
2条回答

您可以使用groupby进行此操作:

dfs = [gb[1] for gb in df.groupby('City')]

这将构造一个数据帧列表,'City'列的每个值一个。在

如果需要具有dataframe值的元组,可以使用:

^{pr2}$

注意按名称分配通常是一种反模式。并且exec和{}绝对是反模式。在

你有固定的城市名单吗?最简单的解决方案是按城市分组,然后可以在组中循环

for city, names in df.groupby("City"):
    print(city)
    print(names)

Portland
       City  Name
2  Portland  John
5  Portland  Mary
Seattle
      City   Name
0  Seattle  Alice
1  Seattle    Bob
3  Seattle   Mark
4  Seattle   Emma

如果您希望df_city["Portland"]工作,则可以分配给字典或类似的(df_city[city] = names)。这取决于你想如何处理组一旦分裂。在

相关问题 更多 >