为什么带有 df.assign 的 lambda 函数不能按预期按行工作?
Why is this lambda function with df.assign not working row-wise as expected?
我有一个数据框,想要获取值列的 idxmin,但对于每个 ID(可能会多次出现)。
我的 df:
data = pd.DataFrame({'ID': [123, 122,122,122,123,125,126],
'values':[ 2, 1, 2, 8, 6, 4, 5]})
不,我会使用 lambda 函数,过滤 df 以获得所有 ID 出现的子选择 df,并使用 idxmin 获取该子选择的最小索引值。当我单独使用不同的部分时,它们会按预期工作,但当我一起使用时,它只会为每一行输出相同的 ID(整体 idxmin)。
data.assign(TEST = lambda x: data.loc[data["ID"]==x["ID"],"values"].idxmin())
输出:
Index
ID
values
TEST
0
123
2
1
1
122
1
1
2
122
2
1
3
122
8
1
4
123
6
1
5
125
4
1
6
126
5
1
有谁知道为什么行为是这样的而不是:
Index
ID
values
TEST
0
123
2
0
1
122
1
1
2
122
2
1
3
122
8
1
4
123
6
0
5
125
4
5
6
126
5
6
谢谢!
在您的 assign
中,x
是完整的数据框,因此
data.loc[data["ID"]==data["ID"],"values"].idxmin()
returns 1
,你的代码相当于:
data.assign(TEST=1)
你需要在这里使用groupby
:
data['TEST'] = data.groupby('ID')['values'].transform('idxmin')
输出:
ID values TEST
0 123 2 0
1 122 1 1
2 122 2 1
3 122 8 1
4 123 6 0
5 125 4 5
6 126 5 6
我有一个数据框,想要获取值列的 idxmin,但对于每个 ID(可能会多次出现)。 我的 df:
data = pd.DataFrame({'ID': [123, 122,122,122,123,125,126],
'values':[ 2, 1, 2, 8, 6, 4, 5]})
不,我会使用 lambda 函数,过滤 df 以获得所有 ID 出现的子选择 df,并使用 idxmin 获取该子选择的最小索引值。当我单独使用不同的部分时,它们会按预期工作,但当我一起使用时,它只会为每一行输出相同的 ID(整体 idxmin)。
data.assign(TEST = lambda x: data.loc[data["ID"]==x["ID"],"values"].idxmin())
输出:
Index | ID | values | TEST |
---|---|---|---|
0 | 123 | 2 | 1 |
1 | 122 | 1 | 1 |
2 | 122 | 2 | 1 |
3 | 122 | 8 | 1 |
4 | 123 | 6 | 1 |
5 | 125 | 4 | 1 |
6 | 126 | 5 | 1 |
有谁知道为什么行为是这样的而不是:
Index | ID | values | TEST |
---|---|---|---|
0 | 123 | 2 | 0 |
1 | 122 | 1 | 1 |
2 | 122 | 2 | 1 |
3 | 122 | 8 | 1 |
4 | 123 | 6 | 0 |
5 | 125 | 4 | 5 |
6 | 126 | 5 | 6 |
谢谢!
在您的 assign
中,x
是完整的数据框,因此
data.loc[data["ID"]==data["ID"],"values"].idxmin()
returns 1
,你的代码相当于:
data.assign(TEST=1)
你需要在这里使用groupby
:
data['TEST'] = data.groupby('ID')['values'].transform('idxmin')
输出:
ID values TEST
0 123 2 0
1 122 1 1
2 122 2 1
3 122 8 1
4 123 6 0
5 125 4 5
6 126 5 6