编辑:建议的可能重复(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[]
变得单调乏味。也许我可以过滤掉那个小切片,编辑它,然后重新附加到原始的?
有什么想法吗?
答案 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.cut
,numpy.select
或numpy.vectorize
来简化您的代码。这些的有用性取决于您尝试应用的具体逻辑。以下问题包括以下各项的示例: