在 pandas 中复制 excel COUNTIF 的输出

Replicating output of excel COUNTIFs in pandas

提问人:user17059762 提问时间:9/20/2022 最后编辑:user17059762 更新时间:9/26/2022 访问量:55

问:

enter image description here

我有包含以下列的数据集 - Source、Sink、StartDate、EndDate、Class、MW、ClearingPrice。我正在尝试创建一个列 (Path_Repeat),如果数据集中存在相同的 StartDate 和 EndDate 的特定源-接收器组合反向,则该列取值 1。

我能够通过使用 =COUNTIFS(A:A,B2,B:B,A2,C:C,C2,D:D,D2,E:E,E2) 在 excel 中做到这一点。我想知道是否有一种方法可以在熊猫中比 excel 更快。

Python Excel Pandas DataFrame 数据操作

评论

0赞 TheMaster 9/20/2022
不要认为你的公式是正确的。1. 你有两个 .2. 如果存在以下组合,则源接收器 B-A 的公式为真:source:C, sink:B 和 source:A,sink:D,但没有相反的路径COUNTIFS
0赞 user17059762 9/20/2022
抱歉,我在复制公式时犯了一个错误。我只用了 1 个 COUNTIFS

答:

1赞 Laurent 9/26/2022 #1

使用以下玩具数据帧:

df = pd.DataFrame(
    {
        "Source": ["A", "B", "A", "B"],
        "Sink": ["B", "A", "C", "A"],
        "StartDate": ["1/1/2010", "1/1/2010", "1/1/2010", "2/1/2010"],
        "EndDate": ["31/1/2010", "31/1/2010", "31/1/2010", "31/1/2010"],
    }
)

这是一种方法:

# Create a new column for comparison
df["key"] = df.apply(lambda x: x["Source"] + x["Sink"], axis=1)
df["key"] = df["key"].apply(lambda x: "".join(sorted(x)))

# Search for duplicates
df.loc[
    df.duplicated(subset=["StartDate", "EndDate", "key"], keep=False), "Path_Repeat"
] = 1

# Cleanup
df = df.fillna(0).astype({"Path_Repeat": int})
  Source Sink StartDate    EndDate key  Path_Repeat
0      A    B  1/1/2010  31/1/2010  AB            1
1      B    A  1/1/2010  31/1/2010  AB            1
2      A    C  1/1/2010  31/1/2010  AC            0
3      B    A  2/1/2010  31/1/2010  AB            0