Pandas - transform () вызывает ValueError, а значения являются строками - PullRequest
0 голосов
/ 26 марта 2020

У меня есть два кадра данных, которые я изначально разделил floor_ и успешно преобразовал их в строки. Моя цель - заменить значения на «1: 0» и добавить «: 1» к остальным, но я получаю ошибку, как показано:

>>>df1
   ID  quantity
0 007      48.0
1 001      37.0
2 006      37.0
3 111      37.0
4 001      34.0
5 101      37.0 

>>>df2
   ID  quantity
0 001      16.0
1 006      16.0
2 111      16.0
3 001      14.0
4 101      16.0
5 111      16.0

df1_to_df2=df1('ID').floordiv(df2('ID')).astype('Int64').astype(str)
>>>df1_to_df2
     quantity
 ID              
007      <NA>  #this must be replaced by "1:0"
001         2  #":1" should be added when only a digit is there
006         2
111         2
001         2
101         2

#Then I tried this:
df1_to_df2=df1_to_df2.transform(lambda x: replace(x,'1:0') if x=='<NA>' else x+':1')

#and it raises this error:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

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

     quantity
 ID              
007      1:0
001      2:1
006      2:1
111      2:1
001      2:1
101      2:1

Большое спасибо !!!

Ответы [ 2 ]

1 голос
/ 26 марта 2020
import pandas as pd
import io
import numpy as np

df1,df2 = map(lambda x: pd.read_csv(io.StringIO(x), sep='\s+', converters={'ID':str}), (s1,s2))

df = (df1.set_index('ID')//df2.set_index('ID')).fillna(0).astype(int)
df.quantity = np.where(df.quantity==0, '1:0', df.quantity.astype(str) + ':1')
df = df.reset_index().drop_duplicates()

print(df)
    ID quantity
0  001      2:1
4  006      2:1
5  007      1:0
6  101      2:1
7  111      2:1

Вы также можете использовать преобразование так, как вы хотите:

df = (df1.set_index('ID')//df2.set_index('ID')).fillna(0).astype(int).astype(str)
df.quantity = df.quantity.transform(lambda x: '1:0' if x=='0' else x+':1')
0 голосов
/ 26 марта 2020

Из вашего описания кажется, что вам нужно только преобразовать количество столбцов: не могли бы вы попробовать следующее небольшое изменение ссылки на столбец и добавить x.replace вместо replace

df1_to_df2['quantity'].transform(lambda x: x.replace(x, '1:0') if x=='<NA>' else x+':1')
...