簡體   English   中英

遍歷熊貓行

[英]Iterating over pandas rows

df

cell;value
0;8
1;2
2;1
3;6
4;4
5;6
6;7

我正在嘗試定義一個函數,該函數將檢查觀察到的行之后的單元格值。 如果在觀察到的一個(i+1)之后的單元格值大於然后觀察到的(i) ,則新列maxValue值等於0,如果較小則為-1。

最終的df應該如下所示:

 cell;value;maxValue
    0;8;1
    1;2;1
    2;1;0
    3;6;1
    4;4;0
    5;6;0
    6;7;0

我尚無法解決的解決方案是:

    def MaxFind(df, a, col='value'):
if df.iloc[a+1][col] > df.iloc[a][col]:
    return 0

df['maxValue'] = df.apply(lambda row: MaxFind(df, row.value), axis=1)

我相信你需要shift與比較gt ,反向掩碼和轉換為整數:

df['maxValue'] = (~df['value'].shift().gt(df['value'])).astype(int)
#another solution
#df['maxValue'] = df['value'].shift().le(df['value']).astype(int)
print (df)
   cell  value  maxValue
0     0      8         1
1     1      2         0
2     2      1         0
3     3      6         1
4     4      4         0
5     5      6         1
6     6      7         1

細節:

df['shifted'] = df['value'].shift()
df['mask'] = (df['value'].shift().gt(df['value']))
df['inverted_mask'] = (~df['value'].shift().gt(df['value']))
df['maxValue'] = (~df['value'].shift().gt(df['value'])).astype(int)
print (df)
   cell  value  shifted   mask  inverted_mask  maxValue
0     0      8      NaN  False           True         1
1     1      2      8.0   True          False         0
2     2      1      2.0   True          False         0
3     3      6      1.0  False           True         1
4     4      4      6.0   True          False         0
5     5      6      4.0  False           True         1
6     6      7      6.0  False           True         1

編輯:

df['maxValue'] = df['value'].shift(1).le(df['value'].shift(-1)).astype(int)

print (df)
   cell  value  maxValue
0     0      8         0
1     1      2         0
2     2      1         1
3     3      6         1
4     4      4         1
5     5      6         1
6     6      7         0

df['shift_1'] = df['value'].shift(1)
df['shift_-1'] = df['value'].shift(-1)
df['mask'] = df['value'].shift(1).le(df['value'].shift(-1))
df['maxValue'] = df['value'].shift(1).le(df['value'].shift(-1)).astype(int)

print (df)
   cell  value  shift_1  shift_-1   mask  maxValue
0     0      8      NaN       2.0  False         0
1     1      2      8.0       1.0  False         0
2     2      1      2.0       6.0   True         1
3     3      6      1.0       4.0   True         1
4     4      4      6.0       6.0   True         1
5     5      6      4.0       7.0   True         1
6     6      7      6.0       NaN  False         0

如果是移位值,請獲取第一個或最后一個缺少的值。 如有必要,可以通過先不添加NaN或最后不添加NaN進行正向或反向填充來替換它們:

df['shift_1'] = df['value'].shift(2)
df['shift_-1'] = df['value'].shift(-2)
df['mask'] = df['value'].shift(2).le(df['value'].shift(-2))
df['maxValue'] = df['value'].shift(2).le(df['value'].shift(-2)).astype(int)
print (df)
   cell  value  shift_1  shift_-1   mask  maxValue
0     0      8      NaN       1.0  False         0
1     1      2      NaN       6.0  False         0
2     2      1      8.0       4.0  False         0
3     3      6      2.0       6.0   True         1
4     4      4      1.0       7.0   True         1
5     5      6      6.0       NaN  False         0
6     6      7      4.0       NaN  False         0

df['shift_1'] = df['value'].shift(2).bfill()
df['shift_-1'] = df['value'].shift(-2).ffill()
df['mask'] = df['value'].shift(2).bfill().le(df['value'].shift(-2).ffill())
df['maxValue'] = df['value'].shift(2).bfill().le(df['value'].shift(-2).ffill()).astype(int)

print (df)
   cell  value  shift_1  shift_-1   mask  maxValue
0     0      8      8.0       1.0  False         0
1     1      2      8.0       6.0  False         0
2     2      1      8.0       4.0  False         0
3     3      6      2.0       6.0   True         1
4     4      4      1.0       7.0   True         1
5     5      6      6.0       7.0   True         1
6     6      7      4.0       7.0   True         1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM