В моем Dataframe есть 2 столбца, один содержит блок, а другой - значение.
df4 = pd.DataFrame({'D': ['g', 'Kg', 'l', 'ml'],
'F': ['500', '1', '1', '1000']})
Я пытаюсь преобразовать Kg в g и l в мл. Я попробовал это:
for row in final_df.iterrows():
if final_df['D']=='Kg':
final_df['F']=(final_df['F']*1000)
final_df['D']='g'
elif final_df['D']=='l':
final_df['F']=(final_df['F']*1000)
final_df['D']='ml'
Ожидаемый результат:
D F
g 500
g 1000
ml 1000
ml 1000
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
С комбинацией функций to_numeric
+ isin
+ replace
:
In [215]: df = pd.DataFrame({'D': ['g', 'Kg', 'l', 'ml'], 'F': ['500', '1', '1', '1000']})
In [216]: df.F = pd.to_numeric(df.F)
In [217]: df.loc[df.D.isin(['Kg','l']), 'F'] *= 1000
In [218]: df.D.replace(to_replace={'Kg': 'g', 'l': 'ml'}, inplace=True)
In [219]: df
Out[219]:
D F
0 g 500
1 g 1000
2 ml 1000
3 ml 1000
Вы можете использовать это:
df['F'] = np.where(df['D'].isin(['Kg','l']), df['F'].astype(int) * 1000, df['F'])
df['D'] = np.where(df['D']=='Kg', 'g', df['D'])
df['D'] = np.where(df['D']=='l', 'ml', df['D'])
Выход:
D F
0 g 500
1 g 1000
2 ml 1000
3 ml 1000
В дополнение к ответу np.where
, используя np.where
, вы также можете рассмотреть df.mask
, который является методом специально для обновления столбца, где условие истинно:
df4['F'] = pd.to_numeric(df4['F'])
df4['F'].mask(df4['D'].isin(['Kg', 'l']), df4['F'] * 1000, inplace=True)
# D F
#0 g 500
#1 Kg 1000
#2 l 1000
#3 ml 1000
Итак, пара проблем с этим кодом Dheeraj. Я попытаюсь объяснить их один за другим.
Здесь код:
final_df = pd.DataFrame({'D': ['g', 'Kg', 'l', 'ml'],'F': [500, 1, 1, 1000]})
for row in range(len(list(final_df.iterrows()))):
if final_df['D'][row]=='Kg' or final_df['D'][row]=='l':
final_df['F'][row]=final_df['F'][row]*1000
print(final_df)
Результат:
D F
0 g 500
1 Kg 1000
2 l 1000
3 ml 1000
Использование -
df4['F'].astype(int).where( ~((df4['D']=='Kg') | (df4['D']=='l')), df4['F'].astype(int)*1000)
Выход
0 500
1 1000
2 1000
3 1000
Name: F, dtype: int64