我有一个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 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。
有更好的方法吗?
发布于 2017-11-20 11:52:02
你有一个固定的城市名单,你想这样做吗?最简单的解决方案是按城市分组,然后遍历组。
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"] )。这取决于你想要对一旦分裂的组做些什么。
发布于 2017-11-20 11:52:22
您可以为此使用groupby:
dfs = [gb[1] for gb in df.groupby('City')]这将构造一个数据格式列表,即'City'列的一个值。
如果您想要具有dataframe值的元组,可以使用:
dfs = list(df.groupby('City'))注意,按名称分配通常是一种反模式。exec和eval绝对是反模式。
https://stackoverflow.com/questions/47391257
复制相似问题