Отключить фрейм данных pandas с текстовыми данными

#python #pandas #string #dataframe

#python #pandas #строка #фрейм данных

Вопрос:

Поскольку все предыдущие вопросы, которые я мог найти о том, как отключить фрейм данных, относились к числовым данным, я до сих пор не нашел, как поступить со следующим.

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

  -------- -------- -------- ------- 
| Level1 | Level2 | Level3 | Props |
 -------- -------- -------- ------- 
| A      | A      | C      | X,Y   |
 -------- -------- -------- ------- 
| A      | B      | C      | Y,Z   |
 -------- -------- -------- ------- 
| D      | E      | F      | Y,Z   |
 -------- -------- -------- ------- 
| G      | H      | I      | X,Z   |
 -------- -------- -------- ------- 
  

И я хотел бы получить это:

  -------- -------- -------- --- --- --- 
| Level1 | Level2 | Level3 | X | Y | Z |
 -------- -------- -------- --- --- --- 
| A      | A      | C      | 1 | 1 | 0 |
 -------- -------- -------- --- --- --- 
| A      | B      | C      | 0 | 1 | 1 |
 -------- -------- -------- --- --- --- 
| D      | E      | F      | 0 | 1 | 1 |
 -------- -------- -------- --- --- --- 
| G      | H      | I      | 1 | 0 | 1 |
 -------- -------- -------- --- --- --- 
  

Как я мог это сделать?

Спасибо!

R.

Ответ №1:

Вы можете создавать макеты с pd.Series.str.get_dummies помощью и объединять обратно в исходный фрейм данных :

 pd.concat((df.drop("Props", 1), df.Props.str.get_dummies(",")), axis=1)


 Level1 Level2  Level3  X   Y   Z
0   A      A       C    1   1   0
1   A      B       C    0   1   1
2   D      E       F    0   1   1
3   G      H       I    1   0   1
  

Как было предложено @BEN_YO, вы могли бы использовать объединение :

 df.join(df.pop("Props").str.get_dummies(","))
  

Комментарии:

1. Может быть, pop / ~ df.join(df.pop(‘Props’).str.get_dummies(«,»))

2. да, ваше решение может быть быстрее. Если вы не против, я добавлю его. таким образом, OP знает о различных вариантах.

3. Конечно, счастливое кодирование

4. В любом случае, это работает 🙂 Я полностью упустил из виду, что то, что я пытался сделать, было эквивалентом одноразового кодирования! Спасибо!

Ответ №2:

 In [208]: df                                                                                                                                                                                                                                                                     
Out[208]: 
  level1 level2 level3   props  dummy
0      A      A      C  [X, Y]      1
1      A      B      C  [Y, Z]      1
2      D      E      F  [Y, Z]      1
3      G      H      I  [X, Z]      1

In [209]: df = pd.DataFrame({'level1': list('AADG'), 'level2': list("ABEH"), 'level3': list("CCFI"), 'props':[list("XY"), list("YZ"), list("YZ"), list("XZ")] })                                                                                                                 

In [210]: df                                                                                                                                                                                                                                                                     
Out[210]: 
  level1 level2 level3   props
0      A      A      C  [X, Y]
1      A      B      C  [Y, Z]
2      D      E      F  [Y, Z]
3      G      H      I  [X, Z]

In [211]: df['dummy'] = 1                                                                                                                                                                                                                                                        

In [212]: df[['level1', 'level2', 'level3']].join(df.explode('props').pivot(columns='props', values='dummy')).fillna(value=0)                                                                                                                                                    
Out[212]: 
  level1 level2 level3    X    Y    Z
0      A      A      C  1.0  1.0  0.0
1      A      B      C  0.0  1.0  1.0
2      D      E      F  0.0  1.0  1.0
3      G      H      I  1.0  0.0  1.0
  

Ответ №3:

Попробуйте это:

 import pandas as pd
  
#reading the csv
df = pd.read_csv('test.csv',delimiter='t')

#making props column a list containing variables
df['props'] = df['props'].map(lambda x : x.split(','))

#getting dummies
df1 =pd.get_dummies(df.props.apply(pd.Series).stack()).sum(level=0)

#concatenating dummies df with original df and dropping 'props'
new_df = pd.concat([df.drop('props',1),df1],axis=1)
print(new_df)
  

Или

 df['props'] = df['props'].map(lambda x : x.split(','))
new_df = pd.concat([df.drop('props',1),pd.get_dummies(df.props.apply(pd.Series).stack()).sum(level=0)],axis=1)
print(new_df)
  

Ввод:

 level1  level2  level3  props
A       A       C       X,Y
A       B       C       Y,Z
D       D       F       Y,Z
G       G       I       X,Z
  

Вывод:

   level1 level2 level3  X  Y  Z
0      A      A      C  1  1  0
1      A      B      C  0  1  1
2      D      D      F  0  1  1
3      G      G      I  1  0  1
  

Комментарии:

1. Это не работает: props содержит строку значений, разделенных запятыми, а не список…

2. Хорошо. Я увидел проблему. Уже слишком поздно, но я обновил код в соответствии с вашими данными.