【问题标题】:How to convert two columns to list of values?如何将两列转换为值列表?
【发布时间】:2022-01-24 06:53:33
【问题描述】:

我有一个像下面这样的dataframe

    A        B  C     D
0  A1    Egypt  10  Yes
1  A1  Morocco   5   No
2  A2  Algeria   4  Yes
3  A3    Egypt  45   No
4  A3    Egypt  17  Yes
5  A3  Tunisia   4  Yes
6  A3  Algeria  32   No
7  A4  Tunisia   7   No
8  A5    Egypt   6   No
9  A5  Morocco   1   No

我想从DB 中获取yesno 的计数。预期的输出需要在下面这样的列表中,这有助于绘制多变量图表。

执行的输出:

yes = [1,2,0,1]
no = [1,2,2,1]
country = ['Algeria', 'Egypt', 'Morocco','Tunisia']

我不确定如何从上面的dataframe 中实现这一点。任何帮助将不胜感激。

这是最小可重复的dataframe 样本:

import pandas as pd

df = pd.DataFrame({'A': {0: 'A1',
                         1: 'A1',
                         2: 'A2',
                         3: 'A3',
                         4: 'A3',
                         5: 'A3',
                         6: 'A3',
                         7: 'A4',
                         8: 'A5',
                         9: 'A5'},
                   'B': {0: 'Egypt',
                         1: 'Morocco',
                         2: 'Algeria',
                         3: 'Egypt',
                         4: 'Egypt',
                         5: 'Tunisia',
                         6: 'Algeria',
                         7: 'Tunisia',
                         8: 'Egypt',
                         9: 'Morocco'},
                   'C ': {0: 10, 1: 5, 2: 4, 3: 45, 4: 17, 5: 4, 6: 32, 7: 7, 8: 6, 9: 1},
                   'D': {0: 'Yes',
                         1: 'No',
                         2: 'Yes',
                         3: 'No',
                         4: 'Yes',
                         5: 'Yes',
                         6: 'No',
                         7: 'No',
                         8: 'No',
                         9: 'No'}}
                  )

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用crosstab:

    df1 = pd.crosstab(df.B, df.D)
    print (df1)
    D        No  Yes
    B               
    Algeria   1    1
    Egypt     2    2
    Morocco   2    0
    Tunisia   1    1
    

    然后用于情节使用DataFrame.plot.bar

    df1.plot.bar()
    

    如果需要列表:

    yes = df1['Yes'].tolist()
    no = df1['No'].tolist()
    country = df1.index.tolist()
    

    【讨论】:

      【解决方案2】:

      通过计算“是”、“否”来创建新列;然后groupby "B" 并在新创建的列上使用sum

      country, yes, no = df.assign(Yes=df['D']=='Yes', No=df['D']=='No').groupby('B')[['Yes','No']].sum().reset_index().T.to_numpy().tolist()
      

      输出:

      ['Algeria', 'Egypt', 'Morocco', 'Tunisia']
      [1, 2, 0, 1]
      [1, 2, 2, 1]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 2016-04-17
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多