2016-07-19 116 views
0

对于未指定标题的道歉。到目前为止,我一直没有成功,试图想出一种基于某些列的内容向熊猫数据框添加新“行”的方法。我希望通过一个例子来说清楚。数据是模拟数据,希望在绘制更大的图像时足够。熊猫数据框 - 根据df中的数据向df添加行

因此,可以说汽车经销商,其中包括以下7个客户。在数据框中,您可以看到他们的客户ID,他们的性别(因为为什么)以及他们目前居住的国家。此外,您可以看到他们是否购买了四种汽车品牌(以及哪种类型的汽车)或不是(NA)(数据框中的所有值都是字符串btw)。例如,Customer 4是来自俄罗斯的女性,她从经销商处购买了保时捷911。

 Cust-id Sex Country Audi Ferrari Porsche Jaguar 
    0 Cu1  F FR  R8 FF  NA  NA 
    1 Cu2  M US  NA NA  NA  XF 
    2 Cu3  M UK  RS7 NA  NA  NA 
    3 Cu4  F RU  NA NA  911 NA 
    4 Cu5  M US  NA NA  918 Ford 
    5 Cu6  F US  S6 NA  NA  F-type 
    6 Cu7  M UK  A8 NA  MacanS XE 

我想什么,能够做的是创造那些顾客买一路车多,每排情况下,新行只指定一个车,其他车品牌栏目都说'NA'在该特定行中。对于上面的例子,这将导致下面的数据框。

  Cust-id Sex Country Audi Ferrari Porsche Jaguar 
    0   Cu1 F FR  R8 NA  NA  NA 
    1   Cu1 F FR  NA FF  NA  NA 
    2   Cu2 M US  NA NA  NA  XF 
    3   Cu3 M UK  RS7 NA  NA  NA 
    4   Cu4 F RU  NA NA  911 NA 
    5   Cu5 M US  NA NA  918 NA 
    6   Cu5 M US  NA NA  NA  Ford 
    7   Cu6 F US  S6 NA  NA  F-type 
    8   Cu7 M UK  A8 NA  NA  NA 
    9   Cu7 M UK  NA NA  MacanS NA 
    10  Cu7 M UK  NA NA  NA  XE 

这意味着原始行与指定的三辆车将导致三个新行,每行仅指定的车型之一(与原排走了)。 “客户”,“性别”和“国家/地区”值不会更改。第一次使用网站自己提问,希望格式不错。感谢任何帮助/指导。 蟒蛇大熊猫据帧

+0

对不起,我的回答或您的问题出了什么问题? http://stackoverflow.com/questions/38523891/python-pandas-how-to-create-new-df-rows-under-certain-condition? – jezrael

回答

1

我会接近这个问题的方法是:

  1. 遍历每个car列,只保留有非空值

    df_dict = {} 
    
    for car in ['Audi', 'Ferrari', 'Porsche' ,'Jaguar']: 
    
        non_nulls = df[ df.apply(lambda x: not pd.isnull(x[car]), axis=1)] 
    
        df_dict[car] = non_nulls[[Cust-id,Sex,Country, car]] 
    
  2. 串连记录与pd.concat的数据帧,这将在适当的位置创建空值

    ​​

沿着这些线应该工作。虽然没有测试我的代码,所以请使用您自己的判断!

+0

不知道格式化是怎么回事:( – elelias

+0

感谢您的回答elelias,非常感谢。在执行代码后,我得到一个TypeError(“无法连接非NDFrame对象”)。任何想法如何解决这个问题? –

+0

对不起,将项目()更改为值(),我将编辑答案 – elelias

0
import pandas as pd 

df = pd.DataFrame({'Audi': ['R8', 'NA', 'RS7', 'NA', 'NA', 'S6', 'A8'], 
'Country': ['FR', 'US', 'UK', 'RU', 'US', 'US', 'UK'], 
'Cust-id': ['Cu1', 'Cu2', 'Cu3', 'Cu4', 'Cu5', 'Cu6', 'Cu7'], 
'Ferrari': ['FF', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA'], 
'Jaguar': ['NA', 'XF', 'NA', 'NA', 'Ford', 'F-type', 'XE'], 
'Porsche': ['NA', 'NA', 'NA', '911', '918', 'NA', 'MacanS'], 
'Sex': ['F', 'M', 'M', 'F', 'M', 'F', 'M']}) 

result = pd.melt(df, id_vars=['Cust-id', 'Sex', 'Country']) 
mask = result['value'] != 'NA' 
result = result.loc[mask] 
result['index'] = result.index 
result = pd.concat([result[['Cust-id', 'Sex', 'Country']], 
      result.pivot(index='index', columns='variable', values='value')], axis=1) 

print(result) 

产生

Cust-id Sex Country Audi Ferrari Jaguar Porsche 
0  Cu1 F  FR R8 None None None 
2  Cu3 M  UK RS7 None None None 
5  Cu6 F  US S6 None None None 
6  Cu7 M  UK A8 None None None 
7  Cu1 F  FR None  FF None None 
15  Cu2 M  US None None  XF None 
18  Cu5 M  US None None Ford None 
19  Cu6 F  US None None F-type None 
20  Cu7 M  UK None None  XE None 
24  Cu4 F  RU None None None  911 
25  Cu5 M  US None None None  918 
27  Cu7 M  UK None None None MacanS 

你可以使用melt的车列合并成一列:

In [232]: result = pd.melt(df, id_vars=['Cust-id', 'Sex', 'Country']); result.head() 
Out[232]: 
    Cust-id Sex Country variable value 
0  Cu1 F  FR  Audi R8 
1  Cu2 M  US  Audi NA 
2  Cu3 M  UK  Audi RS7 
3  Cu4 F  RU  Audi NA 
4  Cu5 M  US  Audi NA 
... 

'NA'字符串值删除的行

mask = result['value'] != 'NA' 
result = result.loc[mask] 

然后用pivot重新设置结果。 pivotroughly the inverse of pd.melt - 它将来自一列(例如'variable')的值分布在多个列中,因此不合并汽车列。

result['index'] = result.index 
result = pd.concat([result[['Cust-id', 'Sex', 'Country']], 
      result.pivot(index='index', columns='variable', values='value')], axis=1) 

result['index'] = result.index被用于确保枢轴保留原样行。