gpt4 book ai didi

python - 在 pandas 中为 Dataframe 单元格分配值时出现问题

转载 作者:行者123 更新时间:2023-12-01 01:04:26 24 4
gpt4 key购买 nike

我正在组合不同的 pandas 数据帧并对最终数据帧的索引进行排序,我发现一些对我来说没有任何意义的东西。它没有给出错误,但没有真正发生分配。我在下面给出一个简化的例子

案例1:

import pandas as pd


ind_1 = ['a','a','b','c','c']
df_1 = pd.DataFrame(index=ind_1,columns=['col1','col2'])

df_1.col1.loc['a'].iloc[0] = 1
df_1.col1.loc['b'] = 2
df_1.col1.loc['c'].iloc[0] = 3

print('Original df_1')
print(df_1)

# Original df_1
# col1 col2
# a 1 NaN
# a NaN NaN
# b 2 NaN
# c 3 NaN
# c NaN NaN

您可以看到此分配工作正常。但是,让我们从以不同方式排序的索引创建数据帧。

ind_1_sorted = sorted(ind_1,reverse=True)
df_1_sorted = pd.DataFrame(index=ind_1_sorted,columns=['col1','col2'])

df_1_sorted.col1.loc['a'].iloc[0] = 1
df_1_sorted.col1.loc['b'] = 2
df_1_sorted.col1.loc['c'].iloc[0] = 3

print('Sorted df_1')
print(df_1_sorted)

# Sorted df_1
# col1 col2
# c NaN NaN
# c NaN NaN
# b 2 NaN
# a NaN NaN
# a NaN NaN

现在您可以看到该分配仅适用于非重复索引。我认为问题一定与排序有关,但让我们看看下一个案例。

案例2:

ind_2 = ['c','c','b','a','a']
df_2 = pd.DataFrame(index=ind_2,columns=['col1','col2'])

df_2.col1.loc['a'].iloc[0] = 1
df_2.col1.loc['b'] = 2
df_2.col1.loc['c'].iloc[0] = 3

print('Original df_2')
print(df_2)

# Original df_2
# col1 col2
# c NaN NaN
# c NaN NaN
# b 2 NaN
# a NaN NaN
# a NaN NaN

现在,如果不实现排序,我们就得不到分配。让我们看看如果对索引进行排序会发生什么

ind_2_sorted = sorted(ind_2,reverse=False)
df_2_sorted = pd.DataFrame(index=ind_2_sorted,columns=['col1','col2'])

df_2_sorted.col1.loc['a'].iloc[0] = 1
df_2_sorted.col1.loc['b'] = 2
df_2_sorted.col1.loc['c'].iloc[0] = 3

print('Sorted df_2')
print(df_2_sorted)

# Sorted df_2
# col1 col2
# a 1 NaN
# a NaN NaN
# b 2 NaN
# c 3 NaN
# c NaN NaN

现在,分配在排序后开始工作!我看到的唯一区别是,当索引以“标准方式”(在本例中按字母顺序)排序时,分配起作用。这有什么意义吗?

如果解决方案首先使用按字母顺序排序的索引,然后按照我想要的顺序对其进行排序,那么如何像这些示例中那样使用重复索引进行排序?

谢谢!

最佳答案

正如用户 Quickbeam2k1 提到的,问题是由于链分配造成的。

索引对象有一个名为 get_loc 的方法,可用于将标签转换为位置,但它的返回类型是多态的,这就是我不喜欢使用它的原因。

使用np.nonzero并对数据帧的索引和列进行过滤,我们可以将标签转换为位置引用并使用iloc而不是loc修改数据帧

即您的第一个代码示例可以重写为:

# original
df_1.col1.loc['a'].iloc[0] = 1
df_1.col1.loc['b'] = 2
df_1.col1.loc['c'].iloc[0] = 3

# works for all indices
col1_mask = df_1.columns == 'col1'
a_mask, = np.nonzero(df_1.index == 'a')
b_mask, = np.nonzero(df_1.index == 'b')
c_mask, = np.nonzero(df_1.index == 'c')
df_1.iloc[a_mask[0], col1_mask] = 1
df_1.iloc[b_mask, col1_mask] = 1
df_1.iloc[c_mask[0], col1_mask] = 3

其他示例也类似

关于python - 在 pandas 中为 Dataframe 单元格分配值时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55513307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com