#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. Хорошо. Я увидел проблему. Уже слишком поздно, но я обновил код в соответствии с вашими данными.