熊猫:编辑数据帧的一部分,让它影响主数据帧

时间:2018-03-31 18:59:23

标签: python python-2.7 pandas dataframe filter

编辑:建议的可能重复(this question)不重复。我询问是否可以编辑一个数据帧切片并使该切片影响原始数据帧。 "重复"建议Q / A只是寻找.loc的替代品。我原来问题的简单答案似乎是," no"。

原始问题:

这个问题可能在某处有重复,但我无法找到它。另外,我猜测我要问的是不可能的,但值得一试。

我希望能够过滤或屏蔽大型数据帧,获得更小的数据帧以便于编码,编辑较小的数据帧,并使其影响较大的数据帧。

这样的事情:

df_full = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6]})

df_part = df_full[df_full['a'] == 2]

df_part['b'] = 'Kentucky Fried Chicken'

print df_full

会导致:

   a  b
0  1  4
1  2  Kentucky Fried Chicken
2  3  6

我很清楚使用.loc[row_indexer, col_indexer]功能的能力,但即使使用mask变量作为row_indexer,对于更复杂的事情来说,它可能有点笨拙目的。

一点上下文 - 我将大型数据库表加载到数据框中,并希望在其中的一小部分上进行许多编辑。所以.loc[]变得单调乏味。也许我可以过滤掉那个小切片,编辑它,然后重新附加到原始的?

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

简短回答

没有。你不想玩你必须继续检查/猜测你是在使用副本还是数据帧视图的游戏。

单一更新:正确的方式

.loc访问者是要走的路。 没有什么关于它的笨拙,虽然需要一些时间来适应。

无论你的标准多么复杂,如果它归结为布尔数组,.loc访问者仍然通常是正确的选择。您需要展示一个真正难以实施的示例。

df_full = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6]})

df_full.loc[df_full['a'] == 2, 'b'] = 'Kentucky Fried Chicken'

#    a                       b
# 0  1                       4
# 1  2  Kentucky Fried Chicken
# 2  3                       6

单一更新:另一种方式

如果您发现.loc访问者难以实施,则另一种选择是numpy.where

df_full['b'] = np.where(df_full['a'] == 2, 'Kentucky Fried Chicken', df_full['b'])

多次更新:适用于多种情况

可以使用

pandas.cutnumpy.selectnumpy.vectorize来简化您的代码。这些的有用性取决于您尝试应用的具体逻辑。以下问题包括以下各项的示例:

Numpy “where” with multiple conditions