在pandas中,如何将len(100)的布尔序列应用于len(10)的 Dataframe 而不抛出错误?

u1ehiz5o  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(109)

抱歉,无法提供数据。这段代码是别人写的,我不明白它是怎么工作的。
有一个dataframe(df),也就是说,100个样本长。他们将其归类为:
[EDIT问题:我忘了包括groupby语句以索引重置结束。在下面添加)。
grouped_df = df.groupby('col_a').sum()['col_b'].sort_values().reset_index()
这导致DataFrame对象的长度为10。
然后,他们创建了一个布尔序列作为掩码使用。他们基于第三列中的值从原始 Dataframe (df)创建了它:
mask = df['col_c'] > 10
这就产生了一个长度为100的布尔级数,自然与df的长度相同。
然后他们将mask(len=100)应用于grouped_df(len=10),结果是长度为5的DataFrame对象。
这是怎么做到的怎么回事?当长度不匹配时,如何将布尔序列应用于 Dataframe 作为掩码?

gojuced7

gojuced71#

下面是我对原始questionprevious答案。

更新:

这是因为pandas静默地将grouped_df的索引与布尔值mask对齐。
下面是一个会导致类似场景的配置:

np.random.seed(20)

df = pd.DataFrame({
    "col_a": np.random.choice(list("ABCDEFGHIJ"), 100),
    "col_b": np.random.randint(0, 20, 100),
    "col_c": np.random.randint(0, 30, 100)
})

grouped_df = (
    df.groupby("col_a").sum()["col_b"]
    .sort_values().reset_index() # length of 10
)

mask = df["col_c"] > 10 # length of 100

out = grouped_df[mask] # length of 5

输出:

print(out)

  col_a  col_b
1     H     52
2     C     70
3     I     70
6     F     87
9     G    190
  • 中间体/详细信息:*
#A friendly warning
UserWarning: Boolean Series key will be reindexed to match DataFrame index.
 
>>> grouped_df
  col_a  col_b
0     B     41
1     H     52
2     C     70
3     I     70
4     D     76
5     E     86
6     F     87
7     A    107
8     J    116
9     G    190

>>> grouped_df.index
RangeIndex(start=0, stop=10, step=1)

>>> mask[mask.eq(True)].index
Index([ 1,  2,  3,  6,  9, 10, 13, 14, 15, 17, 18, 19, 20, 23, 24, 25, 26, 27,
       29, 30, 33, 34, 35, 37, 38, 39, 40, 41, 43, 44, 45, 49, 50, 51, 53, 54,
       61, 63, 64, 67, 68, 69, 70, 71, 74, 75, 78, 79, 81, 83, 84, 85, 88, 89,
       90, 91, 92, 93, 94, 96, 97],
      dtype='int64')

>>> grouped_df.index.intersection(mask[mask.eq(True)].index)
Index([1, 2, 3, 6, 9], dtype='int64')

相关问题