将 DataFrame 拆分为 DataFrame 的

unf*_*olx 4 python python-3.x

我有一个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
Run Code Online (Sandbox Code Playgroud)

此处,“城市”(例如“波特兰”)的给定值由多行共享。

我想从这个数据框创建几个数据框,它们的共同点是一列的值。对于上面的示例,我想获得以下数据框:

     City       Name
0    Seattle    Alice
1    Seattle    Bob
3    Seattle    Mark
4    Seattle    Emma
Run Code Online (Sandbox Code Playgroud)

和

     City       Name
2    Portland   John
5    Portland   Mary
Run Code Online (Sandbox Code Playgroud)

根据这个答案,我正在创建一个可用于生成一个数据框的掩码:

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')
Run Code Online (Sandbox Code Playgroud)

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

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))
Run Code Online (Sandbox Code Playgroud)

这使我的数据帧df_Seattle和df_Portland我可以进一步处理。

有没有更好的方法来做到这一点?

Ken*_*yme 5

你有一个固定的城市清单吗?最简单的解决方案是按城市分组,然后可以遍历组

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
Run Code Online (Sandbox Code Playgroud)

df_city[city] = names如果您想df_city["Portland"]工作,则可以分配给字典或诸如此类的 ( ) 。取决于您想在拆分后如何处理组。