這是我的資料框
import pandas as pd
data = [[1, 1, 1, 0],
[1, 2, 1, 1],
[1, 2, 2, 2],
[2, 1, 1, 3]]
df = pd.DataFrame(data, columns=["idx 1", "idx 2", "idx 3", "value"])
>>> df
idx 1 idx 2 idx 3 value
0 1 1 1 0
1 1 2 1 1
2 1 2 2 2
3 2 1 1 3
我創建了一個“三明治”函式,它復制第一行和最后一行并將它們插入到第一個和最后一個位置:
def sandwich(df):
return pd.concat([df[:1], df, df[-1:]])
>>> df.apply(sandwich)
idx 1 idx 2 idx 3 value
0 1 1 1 0 # new
0 1 1 1 0
1 1 2 1 1
2 1 2 2 2
3 2 1 1 3
3 2 1 1 3 # new
當我想先對資料框進行分組然后將三明治函式應用于每個組時,就會出現問題。
>>> df.groupby(["idx 1", "idx 2"]).apply(sandwich)
idx 1 idx 2 idx 3 value
idx 1 idx 2
1 1 0 1 1 1 0
0 1 1 1 0
0 1 1 1 0
2 1 1 2 1 1
1 1 2 1 1
2 1 2 2 2
2 1 2 2 2
2 1 3 2 1 1 3
3 2 1 1 3
3 2 1 1 3
結果是正確的,但是我實際上得到了兩次,因為 pandas 添加了一個索引并且沒有洗掉“idx 1”和“idx 2”列。之后我可以洗掉索引以獲得所需的結果:
>>> df.groupby(["idx 1", "idx 2"]).apply(sandwich).reset_index(drop=True)
idx 1 idx 2 idx 3 value
0 1 1 1 0
1 1 1 1 0
2 1 1 1 0
3 1 2 1 1
4 1 2 1 1
5 1 2 2 2
6 1 2 2 2
7 2 1 1 3
8 2 1 1 3
9 2 1 1 3
但是,創建一個索引來立即銷毀它似乎不是最好的方法。有沒有更好的辦法?
uj5u.com熱心網友回復:
用于:group_key=False_groupby
df.groupby(["idx 1", "idx 2"], group_keys=False).apply(sandwich)
您將維護由以下生成的原始索引sandwich:
idx 1 idx 2 idx 3 value
0 1 1 1 0
0 1 1 1 0
0 1 1 1 0
1 1 2 1 1
1 1 2 1 1
2 1 2 2 2
2 1 2 2 2
3 2 1 1 3
3 2 1 1 3
3 2 1 1 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/453447.html
上一篇:PandasdataFrame:查找當前值是否大于最后10行的值
下一篇:將字串與范圍連接起來
