我有一个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_Seattle
和df_Portland
。
有更好的方法吗?
答案 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'))
注意按名称分配通常是反模式。 exec
和eval
绝对是反模式。