Проверка условия в pd.DataFrame с помощью np.where () и применение функции к нескольким столбцам - PullRequest
0 голосов
/ 31 января 2020

Предположим, что в кадре данных df и двух столбцах, в каждом из которых размещается соответственно значение массы и единица измерения. Два столбца будут выглядеть следующим образом:

df.head()
    Mass  Unit
0     14     g
1   1.57    kg
2    701     g
3  0.003    tn
4    0.6    kg

Я хочу иметь последовательную систему измерений и, таким образом, я выполняю следующее:

df['Mass']=np.where(df['Unit']=='g', df['Mass']/1000, df['Mass'])  #1
df['Unit']=np.where(df['Unit']=='g', 'kg', df['Unit'])  #2

df['Mass']=np.where(df['Unit']=='tn', df['Mass']*1000, df['Mass'])  #3
df['Unit']=np.where(df['Unit']=='tn', 'kg', df['Unit'])  #4

a) Есть ли способ выполнить # 1 & # 2 в одной строке, возможно, используя apply? б) Можно ли выполнять № 1, № 2, № 3 и № 4 только в одной строке?

Спасибо за потраченное время!

Ответы [ 2 ]

1 голос
/ 31 января 2020

Это возможно по numpy.select, НО, потому что цифры c и строковые столбцы цифры c значения в Mass преобразуются в строки, поэтому последний шаг - в числа с плавающей запятой:

df['Mass'],df['Unit'] = np.select([df['Unit']=='g', df['Unit']=='tn'], 
                                [(df['Mass']/1000, np.repeat(['kg'], len(df))),
                                 (df['Mass']*1000, np.repeat(['kg'], len(df)))], 
                                (df['Mass'],df['Unit']))
df['Mass'] = df['Mass'].astype(float)
print (df)
    Mass Unit
0  0.014   kg
1  1.570   kg
2  0.701   kg
3  3.000   kg
4  0.600   kg

Та же проблема с numpy.where:

df['Mass'],df['Unit'] = np.where(df['Unit']=='g', 
                                (df['Mass']/1000, np.repeat(['kg'], len(df))), 
                                (df['Mass'],df['Unit']))
df['Mass'] = df['Mass'].astype(float)
print (df)
    Mass Unit
0  0.014   kg
1  1.570   kg
2  0.701   kg
3  0.003   tn
4  0.600   kg
0 голосов
/ 31 января 2020

Вы можете сделать следующее, не используя никаких функций numpy,

(i,j) = (df[(df['Unit']=='g')].index, df[(df['Unit']=='tn')].index)    
df.loc[i,'Mass'], df.loc[j,'Mass'], df['Unit'] = df.loc[i,'Mass']/1000, df.loc[j,'Mass']*1000,'kg'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...