python pandas 在组内排序并应用函数

标签 python r pandas apply

假设我有虹膜数据集。有没有办法在 pandas 中简洁地执行以下操作?

  1. 按目标分组
  2. 在每组内,按“萼片长度(厘米)”降序排列数据
  3. 在每个组中,将 1 分配给前 5 行,将 0 分配给其余行?

对于那些了解 R 的人,我只想复制以下代码(是的,这是一个解决方法):

iris %>%
  group_by(Species) %>%
  arrange(desc(Sepal.Length)) %>%
  mutate(size_tag = 1,
         size_tag = cumsum(size_tag),
         size_tag = ifelse(size_tag <= 5, 1, 0))

到目前为止我已经:

from sklearn import datasets
iris = datasets.load_iris()
iris = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                 columns= iris['feature_names'] + ['target'])

def fn(group, col_nm):
    group[col_nm] = 1
    group[col_nm] = np.cumsum(group[col_nm])
    group[col_nm] = np.where(group[col_nm] <= 5, 1, 0)
return group

iris['size_tag'] = np.NaN
iris.groupby('target').apply( pd.DataFrame.sort_values, 'sepal length (cm)' ).apply( fn, args = (['size_tag']))

我得到的结果是附加到 DataFrame 的额外行...

我刚刚开始使用 pandas 和 Python,因此欢迎任何评论(例如与编码风格相关的)。

最佳答案

这会得到一系列的 1 和 0

iris.sort_values(
    'sepal length (cm)', ascending=False
).groupby('target').cumcount().__floordiv__(5).eq(0).astype(np.uint8)

更具可读性

s = iris.sort_values('sepal length (cm)', ascending=False)
c = s.groupby('target').cumcount()
((c // 5) == 0).astype(np.uint8)

使用新列生成副本

s = iris.sort_values('sepal length (cm)', ascending=False)
c = s.groupby('target').cumcount()
top5 = ((c // 5) == 0).astype(np.uint8)
iris.assign(size_tag=top5)

enter image description here

关于python pandas 在组内排序并应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41703408/

相关文章:

python - 如何从 scala 调用 python 函数?

python - 从 DataFrame 到嵌套的 Json 对象

python - 抓取 img src 输出到 base64

r - 从 URL(Dropbox 文件夹)将多个 Parquet 文件加载到 R 中

python - 使用 python-hglib 提交单个文件

r - 错误: package or namespace load failed for �shiny�: When Deploying Shiny App

r - 通过比较字符串来测试 R 中的警告(最好的主意?)

python - Pandas 中 Dataframe 的堆积条形图

类中的python生成器

python - Pandas:反转具有相同值的行