我對 Python 和 Pandas 比較陌生。我有兩個資料框,一個包含一列以逗號分隔的代碼 - 每個串列中的代碼數量可能會有所不同,并且可以包含一個字串,例如“不適用”或空白。另一個是代碼和值的查找表。我想在每個串列中查找每個單獨代碼的值并計算該串列中的最大值。例如 ['H302','H304'] 將是 [18,11] 并且這兩個的最大值將是 18。然后我想將每個串列的最大值作為新列回傳給 df2。如果它包含其他任何內容,則回傳空白。
這個程序最初是用 VBA 撰寫的,我通過分隔符將每組代碼拆分到一個新列來解決問題,然后針對每個代碼動態運行索引/匹配以回傳值。然后它將計算最大值并洗掉所有生成的列。我當時認為這是一種混亂的方式,我不想在 Python 版本中復制它。
我會發布我嘗試過的內容,但我不知道該怎么做——感謝任何幫助!
import pandas as pd
df1 = [['H302',18],
['H312',17],
['H315',16],
['H316',15],
['H319',14],
['H320',13],
['H332',12],
['H304',11]]
df1 = pd.DataFrame(df1, columns=['Code', 'Value'])
df2 = [['H302,H304'],
['H332,H319,H312,H320,H316,H315,H302,H304'],
['H315,H312,H316'],
['H320,H332,H316,H315,H304,H302,H312'],
['H315,H319,H312,H316,H332'],
['H312'],
['Not Applicable'],
['']]
df2 = pd.DataFrame(df2, columns=['Code'])
uj5u.com熱心網友回復:
首先,df2似乎定義錯誤(逗號之間需要單引號)。此外,不要生成它的資料框,因為您需要靈活地擁有任意數量的元素。
其次,您需要將代碼定義為索引以在資料框中查找元素。因此,您可以將資料框定義為:
df1 = pd.DataFrame(df1, columns=['Code', 'Value']).set_index('Code')
第三,在計算最大值之前,您需要遍歷串列的第二個串列并索引您想要的元素.loc。此外,您需要過濾掉不在第一個資料框中的代碼。
result = []
for codes in df2:
c = [_ for _ in codes if _ in df1.index]
result.append(df1.loc[c,'Value'].max())
uj5u.com熱心網友回復:
嘗試:
df2.join(df2['Code'].str.split(',')\
.explode()\
.map(df1.set_index('Code')['Value']).groupby(level=0).max().rename('Value'))
輸出:
Code Value
0 H302,H304 18.0
1 H332,H319,H312,H320,H316,H315,H302,H304 18.0
2 H315,H312,H316 17.0
3 H320,H332,H316,H315,H304,H302,H312 18.0
4 H315,H319,H312,H316,H332 17.0
5 H312 17.0
6 Not Applicable NaN
7 NaN
uj5u.com熱心網友回復:
df3 = []
for i in range(len(df2)):
df3.append(df2['Code'][i].split(","))
max_values = []
for i in range(len(df3)):
for j in range(len(df3[i])):
for index in range(len(df1)):
if df1['Code'][index] == df3[i][j]:
df3[i][j] = df1['Value'][index]
max_values.append(max(df3[i]))
#max_values.append(max[df3[i]])
#for j in range(len(elements)):
df2["Max Value"] = max_values
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/435211.html
