使用多个数据帧创建pandas数据帧

时间:2018-04-09 09:12:53

标签: python pandas csv

我有一个像这样的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?

提前致谢。

2 个答案:

答案 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来连接多个数据帧,但它不如上述解决方案优雅。