[英]How to apply a function only on selected rows and columns of pandas data frame?
我有以下數據框:
id subid a
1 1 1 2
2 1 1 10
3 1 1 20
4 1 2 30
5 1 2 35
6 1 2 36
7 1 2 40
8 2 2 20
9 2 2 29
10 2 2 30
我想在列“ a”上應用例如pandas diff()函數,但是無論何時更改“ id”或“ subid”,都應重新應用該函數,並希望將值存儲在新列中。
以下是我期望的df。
id subid a difference
1 1 1 2 NaN
2 1 1 10 8
3 1 1 20 10
4 1 2 30 NaN
5 1 2 35 5
6 1 2 36 1
7 1 2 40 4
8 2 2 20 NaN
9 2 2 29 9
10 2 2 30 1
從第4行和第8行可以看出,“ id”或“ subid”正在變化,因此存在NaN值,並且在連續的行中計算了diff。
用過的
df["difference"] = df["a"].diff()
這顯然適用於整個專欄,而不是預期的方式。 我試過使用groupby,但是以某種方式提供了額外的行。
感謝您提前提出任何建議。
嘗試這個:
In [97]: df['difference'] = df.groupby(['id','subid'])['a'].diff()
In [98]: df
Out[98]:
id subid a difference
1 1 1 2 NaN
2 1 1 10 8.0
3 1 1 20 10.0
4 1 2 30 NaN
5 1 2 35 5.0
6 1 2 36 1.0
7 1 2 40 4.0
8 2 1 20 NaN
9 2 1 29 9.0
10 2 1 30 1.0
這是一個棘手的問題。 根據您的確切措辭,您想在'id'
或'subid'
發生變化的每個點重設。 這意味着即使它們來回改變。
另外,如果在groupby
上下文中完成diff
計算, diff
計算也不會產生任何影響,因此,我將在發生變化時groupby
計算並掩蓋。
i = df.id.values
s = df.subid.values
i_chg = np.append(False, i[:-1] != i[1:])
s_chg = np.append(False, s[:-1] != s[1:])
df.assign(difference=df.a.diff().mask(i_chg | s_chg))
id subid a difference
1 1 1 2 NaN
2 1 1 10 8.0
3 1 1 20 10.0
4 1 2 30 NaN
5 1 2 35 5.0
6 1 2 36 1.0
7 1 2 40 4.0
8 2 1 20 NaN
9 2 1 29 9.0
10 2 1 30 1.0
設定
df = pd.DataFrame({'a': {1: 2, 2: 10, 3: 20, 4: 30, 5: 35, 6: 36, 7: 40, 8: 20, 9: 29, 10: 30},
'id': {1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 2, 9: 2, 10: 2},
'subid': {1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 2, 7: 2, 8: 1, 9: 1, 10: 1}})
解
#Check for each row if the id-subid pair has changed with previous row and then calculate diff accordingly
df['difference'] = df.apply(lambda x: x.a - df.ix[x.name-1].a
if (x.name>1 and x[['id','subid']].equals(df.ix[x.name-1][['id','subid']]))
else np.nan, axis=1)
df
Out[368]:
a id subid difference
1 2 1 1 NaN
2 10 1 1 8.0
3 20 1 1 10.0
4 30 1 2 NaN
5 35 1 2 5.0
6 36 1 2 1.0
7 40 1 2 4.0
8 20 2 1 NaN
9 29 2 1 9.0
10 30 2 1 1.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.