【问题标题】:Complex datarame filtering python pandas复杂的数据帧过滤 python pandas
【发布时间】:2022-11-10 19:03:48
【问题描述】:

我有一个数据框.我希望它过滤它并将某些值减少为字符串。数据框看起来像这样

代码:

data = [['42.0', 'A'], ['41.0', 'A'], ['43.0', 'B'],['43.0', 'C'], ['41.0', 'B'], ['42.0', 'B']]
df = pd.DataFrame(data, columns=['Number', 'Level'])

我试过这个

df.groupby(['Number', 'Level']).size()

得到这个输出:

但我希望将该输出转换为这样的字符串

42.0(1A,1B,0C)
41.0(1A,1B,0C)
43.0(0A,1B,1C)

【问题讨论】:

  • 为什么 42.0 在 41.0 之前?
  • 为什么你希望有秩序?数据本质上就是这样的。它们不是索引或某些唯一键顺便说一句
  • 我正在关注您的 groupby 输出,它显示的顺序与预期的输出不同。

标签: python python-3.x pandas dataframe numpy


【解决方案1】:

使用crosstabDataFrame.reindex 作为原始顺序,然后添加列名并连接在一起,最后在生成器理解中创建最终字符串:

df = pd.crosstab(df['Number'], df['Level']).astype(str).reindex(df['Number'].unique())
s = df.add(df.columns.to_series()).agg(','.join, axis=1)
print (s)
Number
42.0    1A,1B,0C
41.0    1A,1B,0C
43.0    0A,1B,1C
dtype: object

out = '
'.join(f'{k}({v})' for k, v in s.items())
print (out)
42.0(1A,1B,0C)
41.0(1A,1B,0C)
43.0(0A,1B,1C)

【讨论】:

    【解决方案2】:

    您可以先连接所需的列。

    df['res'] = df.index.astype(str) + df['Level']
    print( df.groupby(['Number', 'res']).size() )
    
    ###Number  res
    ###41.0    1A     1
    ###        4B     1
    ###42.0    0A     1
    ###        5B     1
    ###43.0    2B     1
    ###        3C     1
    ###dtype: int64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2018-02-20
      • 2023-01-27
      相关资源
      最近更新 更多