Python pandas:groupby 并按每组的第一个值划分

Mak*_*aki 1 python dataframe pandas pandas-groupby

我有一个这样的熊猫数据框。

>data

ID Distance   Speed
1  100        40
1  200        20
1  200        10
2  400        20
2  500        30
2  100        40
2  600        20
2  700        90
3  800        80
3  700        10
3  400        20
Run Code Online (Sandbox Code Playgroud)

我想通过GROUPBY表ID,并创建一个新列time通过将在每个值Distance由第一排列Speed每个列ID组。所以结果应该是这样的。

>data

ID Distance   Speed   Time
1  100        40       2.5
1  200        20         5
1  200        10         5
2  400        20        20
2  500        30        25
2  100        40         5
2  600        20        30
2  700        90        35
3  800        80        10
3  700        10      8.75
3  400        20         5
Run Code Online (Sandbox Code Playgroud)

我的尝试:

data['Time'] = data['Distance'] / data.loc[data.groupby('ID')['Speed'].head(1).index, 'Speed']
Run Code Online (Sandbox Code Playgroud)

但结果似乎并不好。你怎么做呢?

jez*_*ael 5

使用transformwithfirst返回与Series原始长度相同的长度df:

data['Time'] = data['Distance'] /data.groupby('ID')['Speed'].transform('first')
Run Code Online (Sandbox Code Playgroud)

或者使用drop_duplicates具有map:

s = data.drop_duplicates('ID').set_index('ID')['Speed']
data['Time'] = data['Distance'] / data['ID'].map(s)
Run Code Online (Sandbox Code Playgroud)
print (data)
    ID  Distance  Speed   Time
0    1       100     40   2.50
1    1       200     20   5.00
2    1       200     10   5.00
3    2       400     20  20.00
4    2       500     30  25.00
5    2       100     40   5.00
6    2       600     20  30.00
7    2       700     90  35.00
8    3       800     80  10.00
9    3       700     10   8.75
10   3       400     20   5.00
Run Code Online (Sandbox Code Playgroud)