Как сохранить dtype ('o') в df вместо bool - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь объединить 5 столбцов в моем фрейме данных в один столбец со строковыми значениями, такими как «A» или «B». Я преобразовал 1 в A, B, C ....

Мои текущие столбцы выглядят так

   A B C D E 
1  A
2      C
3  A
4
5        D
6
7          E
8
9          E
10  B         

И я хочу, чтобы мой столбец выглядел следующим образом

  Type
1  A
2  C
3  A
4
5  D
6
7  E
8
9  E
10 B 

Однако он возвращает True и False вместо A, B, C ..

Мой код указан ниже

dfparsed_A = dfparsed_groupby[(dfparsed_groupby['A'] == 1)]
dfparsed_B = dfparsed_groupby[(dfparsed_groupby['B'] == 1)]
dfparsed_C = dfparsed_groupby[(dfparsed_groupby['C'] == 1)]
dfparsed_D = dfparsed_groupby[(dfparsed_groupby['D'] == 1)]
dfparsed_E = dfparsed_groupby[(dfparsed_groupby['E'] == 1)]

dfparsed_['A'] = dfparsed_groupby['A'].astype(str).replace('1', 'A')
dfparsed_['B'] = dfparsed_groupby['B'].astype(str).replace('1', 'B')
dfparsed_['C'] = dfparsed_groupby['C'].astype(str).replace('1', 'C')
dfparsed_['D'] = dfparsed_groupby['D'].astype(str).replace('1', 'D')
dfparsed_['E'] = dfparsed_groupby['E'].astype(str).replace('1', 'E')

dfparsed2=[(dfparsed_groupby['A'] == 'A') | (dfparsed_groupby['B'] == 'B') | (dfparsed_groupby['C'] == 'C') |(dfparsed_groupby['D'] == 'D') | (dfparsed_groupby['E'] == 'E') ] 

print(dfparsed2)
...
 1203     True
 5368     True
 5644    False
 1089     True
 6488     True
 5651     True
 6485     True
 6237     True
 7632     True
 7637     True
 5635    False
 7445     True
 7484     True
 7492     True
 7638     True
 Length: 6362, dtype: bool]

1 Ответ

0 голосов
/ 02 октября 2019

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

#if necessary
#df = df.replace('', np.nan)
df['Type'] = df.ffill(axis=1).iloc[:, -1]
print (df)
      A    B    C    D    E Type
1     A  NaN  NaN  NaN  NaN    A
2   NaN  NaN    C  NaN  NaN    C
3     A  NaN  NaN  NaN  NaN    A
4   NaN  NaN  NaN  NaN  NaN  NaN
5   NaN  NaN  NaN    D  NaN    D
6   NaN  NaN  NaN  NaN  NaN  NaN
7   NaN  NaN  NaN  NaN    E    E
8   NaN  NaN  NaN  NaN  NaN  NaN
9   NaN  NaN  NaN  NaN    E    E
10  NaN    B  NaN  NaN  NaN    B

Если имеется только одно значение, отличное от NaN, из всех значений NaN в строках:

mask = df == 1
df['Type'] = mask.dot(df.columns)
print (df)
      A    B    C    D    E Type
1     1  NaN  NaN  NaN  NaN    A
2   NaN  NaN    1  NaN  NaN    C
3     1  NaN  NaN  NaN  NaN    A
4   NaN  NaN  NaN  NaN  NaN     
5   NaN  NaN  NaN    1  NaN    D
6   NaN  NaN  NaN  NaN  NaN     
7   NaN  NaN  NaN  NaN    1    E
8   NaN  NaN  NaN  NaN  NaN     
9   NaN  NaN  NaN  NaN    1    E
10  NaN    1  NaN  NaN  NaN    B
...