【问题标题】:Pandas - Compare single row with all rows in same dataframePandas - 将单行与同一数据框中的所有行进行比较
【发布时间】:2020-09-15 17:09:19
【问题描述】:

我想在显示计数值的现有数据框中添加一列。计数值应将给定行中的值与另一列中的所有行进行比较。

在我的示例中,我想查找整个“end_date”列中的值早于当前“start_date”列的次数。像这样将计数添加到数据框:

        start_date   end_date   count
1       2020-09-2   2020-09-3     1
2       2020-09-6   2020-09-7     3
3       2020-09-4   2020-09-5     2
4       2020-09-1   2020-09-1     0

我试过了

df['count'] = (df[df['end_date']<df['start_date']]).count() 

但这会导致所有行的计数列都为 0,因为任何一行中的 start_date 总是小于 end_date。

【问题讨论】:

  • 您尝试过什么来解决这个问题?
  • 所有的值都是数字吗?
  • 我已更新示例以更好地代表我的实际问题
  • 我认为link 回答了你的问题
  • (df[df['end_date']&lt;df['start_date']]) 给你一个布尔数组,用 numpy.sum() 你可以得到True 的数量(因为在python中True是整数1,False是整数0)。那么np.sum((df[df['end_date']&lt;df['start_date']]))给你答案

标签: python


【解决方案1】:
import pandas as pd
my_dict = {'start_date': ['2020-09-02', '2020-09-06', '2020-09-04', '2020-09-01']}
df = pd.DataFrame.from_dict(my_dict)
df['count'] = 0
for index, row in df.iterrows():
    df.at[index,'count'] = df[df['start_date'] < row['start_date']].count()[1]
print (df)

【讨论】:

  • 虽然只有代码的答案可能会回答这个问题,但您可以通过为您的代码提供上下文、此代码工作的原因以及一些文档参考以供进一步阅读,从而显着提高您的答案质量.来自How to Answer“简洁是可以接受的,但更全面的解释更好。”
【解决方案2】:

您希望 count[i] = compare[:] 小于 ref[i] 的次数。
你做了count[:] = 次数compare[i] &lt; ref[i]

一种直接的方法是遍历行并单独计算。

for i, row in df.iterrows():
    df.at[i, 'count'] = (df['end_date'] < row['start_date']).sum()

(df['end_date'] &lt; row[i, 'start_date']) 根据条件是否满足返回TrueFalse 列。 .sum()True 值作为 1 并将 False 值作为 0。

【讨论】:

  • 这大概只适用于基于整数的索引。
  • @ckeiderling 代码的重要部分是迭代行,将迭代行与所有其他行进行比较,并将结果分配给迭代行。如果您的索引不同,那么获取代码的“活性成分”来满足您的要求是微不足道的。
  • @ckeiderling,我已将答案编辑为使用 iterrows()
【解决方案3】:

您可以尝试使用外部连接

counts = (
    pd.merge(
        df[["start_date"]].assign(temp=1),
        df[["end_date"]].assign(temp=1),
        on="temp",
        how="outer",
    )
    .query("start_date>end_date")
    .groupby("start_date")
    .temp.count()
)

df = df.merge(counts, on="start_date", how="left").fillna(0, downcast="infer")

【讨论】:

  • 目前为止效果最好,对于看似简单的问题,它仍然是一个相当长的解决方案。
  • 我已经把它缩短了,不知道如何进一步减少它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2022-11-15
相关资源
最近更新 更多