我有一个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
和{
有更好的方法吗?在
您可以使用
groupby
进行此操作:这将构造一个数据帧列表,
'City'
列的每个值一个。在如果需要具有dataframe值的元组,可以使用:
^{pr2}$注意按名称分配通常是一种反模式。并且}绝对是反模式。在
exec
和{你有固定的城市名单吗?最简单的解决方案是按城市分组,然后可以在组中循环
如果您希望
df_city["Portland"]
工作,则可以分配给字典或类似的(df_city[city] = names
)。这取决于你想如何处理组一旦分裂。在相关问题 更多 >
编程相关推荐