Pandas数据帧基于d中的数据向df添加行

2024-10-03 19:30:08 发布

您现在位置:Python中文网/ 问答频道 /正文

为没有明确的标题道歉。到目前为止,我一直在尝试根据一些列的内容向pandas数据框添加新的“行”,但没有成功。我希望用一个例子来说明这一点。这些数据是模型数据,希望能满足描绘大局的需要。你知道吗

因此,假设一个汽车经销商有以下7个客户。在数据框中,您可以看到他们的客户id、性别(因为为什么不),以及他们目前居住的国家。此外,您可以看到他们是否购买了四个汽车品牌(以及哪种类型的汽车)中的任何一个(NA)(数据框中的所有值都是字符串btw)。例如,客户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

这意味着指定了三辆车的原始行将导致三个新行,每个新行只指定其中一辆车(原始行已消失)。Cust id、Sex和Country值不变。第一次使用网站问一个问题,所以希望自己的格式不是太差。感谢您的帮助/指导。 python数据帧


Tags: 数据id客户frcountry汽车usna
2条回答
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

可以使用^{}将car列合并为一个列:

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]

然后使用^{}来重塑结果。pivotroughly the inverse of ^{}它将一列中的值(例如'variable')分散到多个列中,从而取消合并car列。你知道吗

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用于确保数据透视按原样保留行。你知道吗

我的方法如下:

  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连接数据帧,这将在正确的位置创建空值

    final_df = pd.concat( df_dict.values() )
    

沿着这条路线应该会有效果。虽然没有测试我的代码,所以用你自己的判断!你知道吗

相关问题 更多 >