![](/img/trans.png)
[英]Iterate through dataframe to find first row that satisfies condition for each group of id
[英]Trying to iterate through rows of pandas dataframe and edit row if it satisfies a condition
我附上了我的數據框的圖像,以及我嘗試過的方法的代碼。 我的目標是如果該行滿足條件,則將一行中的前半部分值與該行中的后半部分值切換。
第一種方法檢查條件是否為真(需要切換值),然后將新值直接分配給原始數據幀。
第二種方法檢查條件是否為真(需要切換值)並將值添加到兩個單獨的數據幀中。 如果條件不成立,我將原始值添加到 df1 和 df2。 在塊的末尾,我計划再次將數據幀組合在一起。
然而,這兩種方法都需要很長時間才能運行,而且似乎必須有更有效的方法。 我很難找到最有效的在線方式,如果有任何幫助,我將不勝感激。 謝謝!
方法一:
finalGameID = list(final.loc[:,'GameID'])
for i,v in enumerate(finalGameID):
if final['HomeAway'][i] == 0:
print(v)
values = final.loc[i].values
value1 = list(values[4:124])
value2 = list(values[124:])
final.iloc[i,4:124] = value2
final.iloc[i,124:] = value1
方法二:
df1 = final[final.columns[4:124]]
df2 = final[final.columns[124:]]
df3 = final[final.columns[0:4]]
df1 = df1[0:0]
df2 = df2[0:0]
finalGameID = list(final.loc[:,'GameID'])
for i,v in enumerate(finalGameID):
values = final.loc[i].values
value1 = list(values[4:124])
value2 = list(values[124:])
if final['HomeAway'][i] == 0:
print(v)
df1.loc[len(df1.index)] = value2
df2.loc[len(df2.index)] = value1
else:
df1.loc[len(df1.index)] = value1
df2.loc[len(df2.index)] = value2
您的方法很慢,因為您遍歷行並使用中間副本。
您應該能夠使用布爾索引進行直接交換:
mask = final['HomeAway'].eq(0)
final.loc[mask, 4:124], final.loc[mask, 124:] = final.loc[mask, 124:], final.loc[mask, 4:124]
您正在處理的數據未知,我已嘗試使用重復數據復制您的問題。 在項目中使用時更改變量和索引值
代碼
import pandas as pd
import numpy as np
data = pd.DataFrame({"HomeAway": [1, 1, 0, 0, 1],
"Value1": [14, 16, 29, 22, 21],
"Value2": [8, 14, 24, 14, 19],
"Value3": [6, 2, 5, 8, 2],
"Value4": [3, 3, 2, 2, 0]})
print("BEFORE")
print(data)
left = np.asanyarray(data[data["HomeAway"] == 0].iloc[:, 1:3])
right = np.asanyarray(data[data["HomeAway"] == 0].iloc[:, 3:5])
data.iloc[data["HomeAway"] == 0, 1:3] = right
data.iloc[data["HomeAway"] == 0, 3:5] = left
print("AFTER")
print(data)
輸出
BEFORE
HomeAway Value1 Value2 Value3 Value4
0 1 14 8 6 3
1 1 16 14 2 3
2 0 29 24 5 2
3 0 22 14 8 2
4 1 21 19 2 0
AFTER
HomeAway Value1 Value2 Value3 Value4
0 1 14 8 6 3
1 1 16 14 2 3
2 0 5 2 29 24
3 0 8 2 22 14
4 1 21 19 2 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.