我曾经使用较早的Pandas版本(0.22,py2)以特定的方式转置一个表.最近,我有一些时间开始将整个脚本移动到Pandas 2/py3,我注意到它在df.replace()停止工作,抛出ValueError

输入df如下所示:

       Fruit   Vegetable  Sour_taste
Apple   1.0    NaN        1.0
Lemon   1.0    NaN        1.0
Potato  NaN    1.0        NaN

我希望它看起来是这样的:

Apple   Fruit,Sour_taste
Lemon   Fruit,Sour_taste
Potato  Vegetable

我曾经在Pandas 0.22/py2中这样 retrofit 过这张表:


df = df.apply(lambda column: column.replace(to_replace = column.loc[column > 0], value = column.name), axis = 0)

df["merged"] = df.apply(lambda row: ",".join(row.dropna().astype(str)), axis=1)

df = df[["merged"]].reset_index()

但是pandas2/py3中的第一行代码的结果是:

ValueError: Series.replace cannot use dict-like to_replace and non-None value

我既不理解错误消息,也不理解为什么会发生这种情况.

推荐答案

要修复代码,您需要掩码值,然后使用apply中的索引:

df.where(df.ge(1)).apply(lambda x: ','.join(x.dropna().index), axis=1)

输出:

Apple     Fruit,Sour_taste
Lemon     Fruit,Sour_taste
Potato           Vegetable
dtype: object

或者,如果您有一个包含许多行和列的稀疏输入,这可能会更有效率:

out = (df
   .where(df.ge(1)).stack().reset_index(1)['level_1']
   .groupby(level=0).agg(','.join)
)

导致该错误的原因是什么?

在你的apply中,column是一个系列.当将一个Series传递给Series.replace时,这将作为一个字典进行处理,其中Series索引是要替换的值,而值是替换(例如,pd.Series({'A': 'B'})将用B替换所有A).要使原始代码正常工作,您需要将其转换为List:

df.apply(lambda column: column.replace(to_replace=column.loc[column > 0].tolist(), value = column.name), axis=0)

Python-3.x相关问答推荐

类型的可变性对变量的作用域有影响吗?

如何从Django连接到Neo4J s AuraDB(免费层)?'

Gekko优化超出了方程式的界限(由于某种原因,会产生变量)

字符串块数组:如何根据一个数组中的元素对另一个数组中的元素进行分组

如何定义既允许固定单词又允许模式的pydanti.BaseModel?

如何创建与导航抽屉一起使用的导航栏

Django在POST到外部URL时如何进行CSRF保护? 更新

从一列字符串中提取子字符串并将它们放入列表中

使用 RANSAC 在激光雷达点云中查找电力线

是否可以将多个 if 转换为数组?

Python从base64转换为二进制

创建一个可旋转的 3D 地球

pandas 中 df.reindex() 和 df.set_index() 方法的区别

如何使用python将放置在多个嵌套文件夹中的文档移动和重命名为一个新的单个文件夹?

作为函数对象属性的 __kwdefaults__ 有什么用?

Python3 的超级和理解-> TypeError?

如何将 cv2.imread 匹配到 keras image.img_load 输出

如何正确创建自定义文本编解码器?

连接 dict 值,它们是列表

如何对字典的函数输出列表进行单元测试?