将DataFrame拆分为DataFrame' s

时间:2017-11-20 11:44:24

标签: 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

这里是" City"的给定值。 (例如" Portland")由多行共享。

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

     City       Name
0    Seattle    Alice
1    Seattle    Bob
3    Seattle    Mark
4    Seattle    Emma

     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_Seattledf_Portland

有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

你有一个固定的城市名单你想要这样做吗?最简单的解决方案是按城市分组,然后循环遍历群组

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[city] = names能够工作,则可以分配给字典或某些字典(df_city["Portland"])。拆分后,取决于您想要对组进行的操作。

答案 1 :(得分:3)

您可以使用groupby

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

这将构建一个数据框列表,每个'City'列的值一个。

如果您希望元组具有数据帧的值,您可以使用:

dfs = list(df.groupby('City'))

注意按名称分配通常是反模式。 execeval绝对是反模式。