我有一个像这样的csv文件:
Fruit_Type;Fruit_Color;Fruit_Description
Apple;Green,Red,Yellow;Just an apple
Banana;Green,Yellow;Just a Banana
Orange;Red,Yellow;Just an Orange
Grape;;Just a Grape
(注意:单元格内部有逗号,颜色类型编号可变,最多有三种不同的颜色)
我想要的结果是:
Fruit_Type; Fruit_Color; Fruit_Description
Apple;Green;0;0;Just an apple
Apple;0;Red;0;Just an apple
Apple;0;0;Yellow;Just an apple
Banana;Green;0;0;Just a Banana
Banana;0;Red;0;Just a Banana
Banana;0;0;Yellow;Just a Banana
Orange;Green;0;0;Just an Orange
Orange;0;Red;0;Just an Orange
Orange;0;0;Yellow;Just an Orange
Grape;0;0;0;Just a Grape
Grape;0;0;0;Just a Grape
Grape;0;0;0;Just a Grape
我想将数据框Fruit_Color列拆分为3列,这些颜色为0,不存在的颜色。
我试图像这样转换数据帧信息数据帧,以获得包含某些字符串的行:
test.py
#load the csv data into dataframe
data = pd.read_csv(open('test.py','rb'),delimiter=';',encoding='utf-8')
#detect the rows where're the color
Green = data.loc[data['Fruit_Color'].str.contains('Green', case=True)]
Red = data.loc[data['Fruit_Color'].str.contains('Red', case=True)]
Yellow = data.loc[data['Fruit_Color'].str.contains('Yellow', case=True)]
我的行包含特定的颜色,但我不知道如何用这些数据帧制作连接的数据帧,我怎么知道那些没有任何颜色的行如Grape?
提前致谢。
答案 0 :(得分:1)
我建议使用str.get_dummies
:
df = df.join(df.pop('Fruit_Color').str.get_dummies(','))
print (df)
Fruit_Type Fruit_Description Green Red Yellow
0 Apple Just an apple 1 1 1
1 Banana Just a Banana 1 0 1
2 Orange Just an Orange 0 1 1
3 Grape Just a Grape 0 0 0
答案 1 :(得分:0)
您可以使用assign
创建列:
df.assign(
green=lambda d: d['Fruit_color'].str.contains('Green', case=True),
red=lambda d: d['Fruit_color'].str.contains('Red', case=True),
yellow=lambda d: d['Fruit_color'].str.contains('Yellow', case=True),
)
这会产生一个新的数据帧,其中包含三列布尔值,即“绿色”,“红色”和“黄色”。
要检测没有已知颜色的行,您还可以指定other_color=lambda d: ~(d['green'] | d['red'] | d['yellow'])
。
另一种可能性是使用pandas.concat
来连接多个数据帧,但它不如上述解决方案优雅。