Python 字符串列上Pandas Group By-Transform的奇怪行为
我在熊猫.groupby()和.transform()中遇到了一个奇怪的行为。以下是生成数据集的代码:Python 字符串列上Pandas Group By-Transform的奇怪行为,python,pandas,transform,Python,Pandas,Transform,我在熊猫.groupby()和.transform()中遇到了一个奇怪的行为。以下是生成数据集的代码: df = pd.DataFrame({"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] , "Random_Number&q
df = pd.DataFrame({"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] ,
"Random_Number": [1223344, 373293832, 32738382392, 7273283232, 8239329, 23938832],
"City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"]})
这是我为transform()编写的函数
然后,我将我的函数与transform一起使用,完美地工作并得到我想要的
df_2 = stack.groupby(["City"])['Name','Random_Number'].transform(some)
然而,当我将列的顺序从['Name','Random\u Number']
切换到['Random\u Number','Name']
时,奇怪的事情发生了
df_2 = stack.groupby(["City"])['Random_Number','Name'].transform(some)
当您查看'Name'
列中的单元格时,熊猫似乎多次将所有内容放入一个单元格中:
df_2.iloc[0,1]
# Return:
# 0 Alice--4
# 1 Bob--4
# 3 Mallory--4
# 4 Bob--4
# Name: Name, dtype: object
为什么会发生这种情况?问题在于您的
返回
如果x.dtype=='object'
,则返回一个序列,以便变换
聚合不会减少(返回的长度与原始长度相同)。如果它采用另一条路径,则返回的是单个标量0
,pandas将其视为减少(返回是每个组的单个值)
因为您的聚合在缩减方面有所不同,所以内部pandas
用于确定要采取的路径以及如何将其恢复到原始数据帧的方法都会因列顺序而变得混乱。当'Random\u Number'
是第一个时,它会检查函数,看到函数减少并采用一条路径,但如果'Name'
是第一个,它会检查函数,看到函数没有减少并采用另一条路径进行计算
您可以通过确保两个返回不减少
def some(x):
if x.dtype == 'object':
return x + '--' + str(len(x))
else:
return [0]*len(x)
df.groupby('City')[['Random_Number','Name']].transform(some)
# Random_Number Name
#0 0 Alice--4
#1 0 Bob--4
#2 0 Mallory--2
#3 0 Mallory--4
#4 0 Bob--4
#5 0 Mallory--2
df.groupby('City')[['Name', 'Random_Number']].transform(some)
# Name Random_Number
#0 Alice--4 0
#1 Bob--4 0
#2 Mallory--2 0
#3 Mallory--4 0
#4 Bob--4 0
#5 Mallory--2 0
这不是更改列顺序的方式。例如,df=df[df.columns[new_order]]
从答案到问题都会这样做。这是否回答了您的问题?非常感谢您的评论,这绝对有帮助!哇,这就是原因!非常感谢你!现在我明白了!
def some(x):
if x.dtype == 'object':
return x + '--' + str(len(x))
else:
return [0]*len(x)
df.groupby('City')[['Random_Number','Name']].transform(some)
# Random_Number Name
#0 0 Alice--4
#1 0 Bob--4
#2 0 Mallory--2
#3 0 Mallory--4
#4 0 Bob--4
#5 0 Mallory--2
df.groupby('City')[['Name', 'Random_Number']].transform(some)
# Name Random_Number
#0 Alice--4 0
#1 Bob--4 0
#2 Mallory--2 0
#3 Mallory--4 0
#4 Bob--4 0
#5 Mallory--2 0