【问题标题】:converting type of pandas columns under MultiIndex在 MultiIndex 下转换 pandas 列的类型
【发布时间】:2018-09-04 17:21:30
【问题描述】:

我有类似的东西

>>> df
      user1 user2 param
                   0             1      2
                   a      x      d      a 
    0  2     6     0      1      0      0
    1  4     13    0      0      0      3
    2  21    76    2      0      1      0

注意user1user2param 处于同一级别(合并的副作用):

>>> df.columns.get_level_values(0)
Index(['user1','user2','param','param','param','param'], dtype='object')

>>> df.columns.get_level_values(1)
Index(['','',0,0,1,2], dtype='object')

我想将param 下的所有内容都转换为浮点数,但将user1user2 保留为整数。我已经检查了this thread,但我不确定它如何转化为 setting column dtypes。

编辑:

生成器代码

df = pd.DataFrame({'user1':[2,4,21,21],'user2':[6,13,76,76],'param1':[0,2,0,1],'param2':['x','a','a','d'],'count':[1,3,2,1]}, columns=['user1','user2','param1','param2','count'])
df = df.set_index(['user1','user2','param1','param2'])
df = df.unstack([2,3]).sort_index(axis=1)

df2 = pd.DataFrame({'user1':[2,5,21],'user2':[6,18,76]})
df2.columns = pd.MultiIndex.from_product([df2.columns, [''],['']])
final_df = df2.merge(df, on=['user1','user2'], how='outer').fillna(0)

【问题讨论】:

  • 你能提供一个DataFrame生成器吗?
  • 嗨@gonzalomr 我在上面添加了一些生成器代码,谢谢

标签: pandas


【解决方案1】:

我无法为您的特定 DataFrame 提供经过测试的解决方案,因为我不确定它的确切结构。

但是在 MultiIndex DataFrame(和任何其他)上,您可以使用组成它们的 Series 的基础属性对 DataFrame 的各个列执行更改。在这种情况下,您可以通过过滤series.name 来更改 param 下所有列的 dtypes,如下所示。

df.apply(lambda x: x.astype(float) if 'param' in x.name else x)

pandas 构造 MultiIndex 名称的方式是创建一个具有不同级别的元组,因此对其进行 contains 操作会为您提供所需的列。

编辑:

我已经测试了您的示例 DataFrame 中的代码,它可以正常工作。

看到你的评论。如果您想手动访问和修改每一列,您可以使用 astype 方法自行完成。

final_df['count'] = final_df['count'].astype(float)

【讨论】:

  • 虽然我不确定contains...我在上面添加了一些生成器代码。我正在考虑添加这些系列中的每一个并手动完成,但在完整版本中(这是一个示例),这些列有很多,如果我可以用一个名称引用它们是最好的(在在这种情况下,名称count)。
  • 这取决于是否所有以相同方式命名的列都需要具有相同的 dtype。在肯定的情况下,这可以毫无问题地使用,否则可以使用其他标准来定位您想要的列。如果添加是手动检查答案编辑。
猜你喜欢
  • 2012-10-13
  • 2023-03-02
  • 2017-11-24
  • 2023-03-23
  • 2013-03-22
  • 2022-11-01
  • 2019-04-07
  • 2018-07-25
  • 2020-05-27
相关资源
最近更新 更多