【问题标题】:Pandas split gender column to two columnsPandas 将性别列拆分为两列
【发布时间】:2018-11-25 20:31:46
【问题描述】:

我有下表: https://ibb.co/DMGCgD2

我想在每个邮政编码中将(属性类型)拆分为两列 count_Single_Family 和 count_Multi_Family:

我使用了这段代码,但我不知道下一步该做什么:

b=Combineddf[Combineddf['Property Type']=='Multi-Family'].count() a=Combineddf[Combineddf['Property Type']=='Single Family'].count()

我可以用 sql 做到这一点,但我一直试图让它与 pandas 一起工作,但没有运气。感谢您的帮助。 编辑* 输入:

    import pandas as pd
input= pd.DataFrame({'Zip Code': [90001, 90001, 90001,90002,90002,90002], 
                   'Total Males': [28468, 28468, 28468,43533,43533,43533],
                  'Total Female': [32135, 32135, 32135,54354,54354,54354],
                   'Property Type': ['Multi-Family', 'Multi-Family', 'Single Family','Single Family','Single Family','Multi-Family']
                  })
input

期望的输出:

    out = pd.DataFrame({'Zip Code': [90001, 90001, 90001,90002,90002,90002], 
                       'Total Males': [28468, 28468, 28468,43533,43533,43533],
                      'Total Female': [32135, 32135, 32135,54354,54354,54354],
                       'Multi-Family': [2, 2, 2,1,1,1],
                       'Single Family': [1, 1, 1,2,2,2],

                      })
out

【问题讨论】:

  • @PeterLeimbigler 这是来自 csv 文件我修复了链接

标签: python pandas split pandas-groupby


【解决方案1】:

pd.crosstab + merge

Pandas 有一种基于索引和值进行交叉制表的方法。然后,您只需要将这些结果与您的原始数据框合并。

df_cross = pd.crosstab(df['Zip Code'], df['Property Type'])

res = df.merge(df_cross, left_on='Zip Code', right_index=True)

print(res)

   Zip Code  Total Males  Total Female  Property Type  Multi-Family  \
0     90001        28468         32135   Multi-Family             2   
1     90001        28468         32135   Multi-Family             2   
2     90001        28468         32135  Single Family             2   
3     90002        43533         54354  Single Family             1   
4     90002        43533         54354  Single Family             1   
5     90002        43533         54354   Multi-Family             1   

   Single Family  
0              1  
1              1  
2              1  
3              2  
4              2  
5              2  

【讨论】:

    【解决方案2】:

    这似乎产生了正确的解决方案:

    v = input.groupby(['Zip Code','Property Type']).count().reset_index().pivot(index='Zip Code',columns = 'Property Type',values = 'Total Males')
    
    pd.merge(input,v, how = 'inner', left_on = 'Zip Code', right_on ='Zip Code').drop('Property Type',axis = 1)
    

    【讨论】:

    • v.columns 如何找到您?
    【解决方案3】:

    另一种解决方案:

    (pd.concat([input.set_index('Zip Code'), 
                input.groupby('Zip Code')['Property Type']
                     .value_counts()
                     .unstack()], axis=1)
    ).reset_index()
    
       Zip Code  Total Males  Total Female  Property Type  Multi-Family  Single Family
    0     90001        28468         32135   Multi-Family             2              1
    1     90001        28468         32135   Multi-Family             2              1
    2     90001        28468         32135  Single Family             2              1
    3     90002        43533         54354  Single Family             1              2
    4     90002        43533         54354  Single Family             1              2
    5     90002        43533         54354   Multi-Family             1              2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多