這是我的輸入資料,存盤在資料框 df 中。

現在我想將 B 列中的所有值更改為每年格式。這是我的代碼:
D = []
for i in df['B']:
for j in df['C']:
if j == 'Year':
D.append(int(i)/1)
elif j == 'Month':
D.append(int(i)/12)
elif j == 'Day':
D.append(int(i)/365)
print(len(df))
print(len(D))
雖然我原來的 df 只有 10 的 len,但輸出(串列 D)的 len 為 100。有人知道如何解決這個問題嗎?
uj5u.com熱心網友回復:
你可以試試map
df['D'] = df['B'].div(df['C'].map({'Year':1, 'Month':12, 'Day':365})
uj5u.com熱心網友回復:
B 的大小為 10,C 的大小為 10。您回圈 C 10 次。這將生成大小為 100 的 D。因為它們的大小相同,所以您只需要 1 個 for 回圈來填充 D。
uj5u.com熱心網友回復:
您的代碼迭代 10 X 10 次,因為對于df['B'] 的每個 i,它都會遍歷df['C'] 的所有行。
https://pandas.pydata.org/docs/user_guide/basics.html#iteration
D = []
for row in df.itertuples():
if row.C == 'Year':
D.append(int(i)/1)
elif row.C == 'Month':
D.append(int(i)/12)
elif row.C == 'Day':
D.append(int(i)/365)
uj5u.com熱心網友回復:
您應該使用 df.apply() 方法應用一個函式。
只需在函式中定義邏輯以回傳每行所需的值,例如:
def convertValues(row):
if row['C'] == 'Year':
return int(row['B'])
elif row['C'] == 'Month':
return int(row['B'])/12
elif row['C'] == 'Day':
return int(row['C'])/365
return 'Invalid String'
然后你只需應用到資料框:
yearly_values = df.apply(convertValues, axis=1)
您的結果將是 Pandas 系列,然后您可以將其投射到串列或做任何您想做的事情。
您還可以使用以下方法在該資料框上創建一個具有相應值的新列:
df['D'] = df.apply(convertValues, axis=1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/517717.html
下一篇:如何使用另一個資料框洗掉行
