首页 > 解决方案 > 如何使用用户输入迭代地构建 pd 系列,一次一个单元格?

问题描述

我正在尝试使用我自己的输入数据对 pd 系列中剩余的默认猫进行分类:

ex_df = df[df['Cat_Self_Pred'] == 'Uncatted'][['Content','Amount','Cat_Self_Pred']] # shallow copy, so that the orig df is changed

for x in range(len(ex_df)): # how ever many this would be
    print(ex_df[['Content','Amount']].loc[x])
    ex_df['Cat_Self_Pred'].loc[x] = input()

因此,对于 df['Cat_Self_Pred'] 的“Un_catted”,我想使用一种理解来根据“内容”和“金额”一次输入每一个

即使我执行上述操作,我也会收到有关将值分配给数据框副本的警告

标签: pythonpandasdataframeinputseries

解决方案


ex_df是对数据框进行 2 次“索引”操作的结果,因此分配给它总是会产生警告。基本上它可能是一个view (你称之为浅拷贝)或一个copy.

the pandas docs这个:

分配给链式索引的乘积具有固有的不可预测的结果。[...] 很难预测它会返回视图还是副本(这取决于数组的内存布局,pandas 对此不做任何保证)

好消息是,有一种简单且明确的方法可以实现您想要实现的目标。

您可以迭代索引并直接分配给,而不是创建副本并对其行进行迭代df :

for idx in df.index[df['Cat_Self_Pred'] == 'Uncatted']:
    print(df.loc[idx, ['Content', 'Amount']])
    df.loc[idx, 'Cat_Self_Pred'] = input()

另请注意,您正在使用.loc[x]x不是索引,它是 ex_df 中的整数行号 - 在这种情况下您需要.iloc[x].


推荐阅读