我有一個 pandas df,并且想計算某個列的值之間的所有可能差異,同時保留生成每個差異值的行的索引。
在我的 python 新手看來,最合理的方法似乎如下:
- 創建一個函式來定位參與計算的所有值并計算差異
- 讓函式回傳三個串列:參與操作的兩個索引和結果
- 將這三個串列存盤在 df 中,正如另一個執行緒中所建議的那樣。我正在使用以下代碼:
ind1 = []
ind2 = []
delta = []
def calculator(): # id stands for index
for i in range(len(df)):
for j in range(len(df)):
v1 = df.loc[i, 'col']
v2 = df.loc[j, 'col']
dv = abs(v1-v2)
delta.append(dv)
ind1.append(i)
ind2.append(j)
return ind1, ind2, delta
構建新df時出現問題,因為我遇到了拆包問題:
data = []
for ind1, ind2, delta in calculator():
data.append([ind1, ind2, delta])
new_df = pd.DataFrame(data, columns=['ind1', 'ind2', 'delta'])
回傳:
ValueError: too many values to unpack (expected 3)
關于如何解決這個問題的任何想法,同時按照另一個執行緒中的指示正確構建 df ?
uj5u.com熱心網友回復:
for不像您預期??的那樣作業。考慮以下玩具示例:
for x,y,z in [[1,2,3], [4,5,6], [7,8,9]]:
print(x,y,z)
你會期望輸出是:
1 4 7
2 5 8
3 6 9
但你得到的是
1 2 3
4 5 6
7 8 9
之所以會發生這種情況,是因為回圈會迭代您串列中的每個專案,該串列本身就是一個串列,并嘗試將其擴展為您可能存在或不存在的 3 個引數。zip要轉置串列(串列),您可以像這樣使用內置
for x,y,z in zip(*[[1,2,3], [4,5,6], [7,8,9]]):
print(x,y,z)
或在您的特定情況下:
for ind1, ind2, delta in zip(*calculator()):
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/434027.html
標籤:Python pandas dataframe unpack
上一篇:將json資料轉換為資料框
