Изменение значения столбца Pandas Dataframe путем проверки состояния другого столбца - PullRequest
0 голосов
/ 01 декабря 2018

Мой Dataframe имеет 2 столбца, один содержит единицу измерения, а другой - значение.

     df4 = pd.DataFrame({'D': ['g', 'Kg', 'l', 'ml'],
                         'F': ['500', '1', '1', '1000']})

Я пытаюсь преобразовать килограммы в г, а л в мл.Я пробовал это:

    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().

Ответы [ 5 ]

0 голосов
/ 01 декабря 2018

Вы можете использовать это:

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
0 голосов
/ 01 декабря 2018

С комбинацией функций 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
0 голосов
/ 01 декабря 2018

Итак, пара проблем с этим кодом Dheeraj.Я попытаюсь объяснить их один за другим.

  • Первое, что вы пытаетесь установить значения числового типа в столбце F как объекты String, помещая их в кавычки и пытаясь разделитьстрока через целое число.Очевидно, что это приведет к ошибке.
  • Во-вторых, вы пытаетесь поместить условный оператор на весь столбец, используя final_df ['D'] == 'Kg';пока вы перебираете строку за строкой.Так что, если вы делаете это с помощью итераций, то вам также следует обратиться к определенной строке, например: final_df ['D'] [row] == 'Kg'
  • Другая проблема связана с методом итерации.В то время как ваш цикл повторялся 4 раза, но бесполезно повторять, используя iterrows ().Я предлагаю использовать длину и создать диапазон значений и использовать его в качестве индекса (который вы можете увидеть в моем ответе ниже).
  • И последний вопрос скорее зависит от того, что вы пыталисьделать;поэтому, если вы хотите преобразовать килограммы и литры в граммы и мл, то вам следует умножать, а не делить.

Вот код:

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
0 голосов
/ 01 декабря 2018

В дополнение к ответу Viveks, используя 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
0 голосов
/ 01 декабря 2018

Использование -

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...