【问题标题】:Why can't you replace integers with lists using `replace` method - pandas为什么不能使用“替换”方法用列表替换整数 - 熊猫
【发布时间】:2019-04-23 21:50:39
【问题描述】:

假设我有一个如下的熊猫数据框:

df=pd.DataFrame({'a':[1,2,3,0]})

所以我的目标是在这个数据框中用[](空列表)替换0值,但我做到了:

print(df.replace(0,[]))

但它给了我一个错误:

TypeError: Invalid "to_replace" type: 'int'

我尝试了所有可能的方法,即:

df[df==0]=[]

等等……

但没有任何效果。

期望的输出(以防混淆):

   a
0  1
1  2
2  3
3 []

【问题讨论】:

    标签: python pandas dataframe replace types


    【解决方案1】:

    可以通过列表理解来实现,但是因为混合内容 - 数字与列表不推荐:

    df['a'] = [[] if x == 0 else x for x in df.a]
    
    print (df)
    
        a
    0   1
    1   2
    2   3
    3  []
    

    并替换所有列中的所有值:

    df = df.applymap(lambda x: [] if x == 0 else x)
    print (df)
        a
    0   1
    1   2
    2   3
    3  []
    

    【讨论】:

    • 请注意,如果len(df) > 1[[]] * len(df) 可能不起作用。它将创建一个包含相同空列表实例的列表,而不是 len(df) 唯一的空列表,这可能不是您想要的。您需要使用列表推导来创建新列表。
    【解决方案2】:

    这里有两个问题。首先是熊猫在处理列表时的怪癖。要将 DataFrame 中的值替换为列表,您需要执行以下操作;

    df.loc[df.a == 0, "a"] = [[] for _ in df[df.a == 0]]
    

    这会根据符合条件的项目数创建 n 空列表 (df == 0)

    第二个问题是您的列是整数类型,您不能将列表存储在整数列中。因此,在分配列表之前,您首先需要先将列类型转换为对象。

    df = df.astype(object)
    df.loc[df.a == 0, "a"] = [[] for _ in df[df.a == 0]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2022-12-23
      • 1970-01-01
      • 2019-09-27
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多