【问题标题】:How to identify a number that has a correspondent negative in a list?如何识别列表中对应负数的数字?
【发布时间】:2022-01-07 14:33:19
【问题描述】:

我是 Python/VBA 之旅的初学者,所以我有一个问题想问你。

所以我有一个 Excel 电子表格中的行列表(我也用 Pandas 处理这些数据以减少我必须在 Excel 上分析的行数)

事实上,我有成千上万行在特定列中具有如下值:

      col
0 -142.60
1  142.60
2 -565.78
3  565.78
4  -90.00
5   90.00
6   63.26
7  -63.26
8  117.96

所以我只想知道如何自动删除对应负数且 sum = 0 的行。

我这里只想要 117,96 行。

【问题讨论】:

  • 117,96 在这种情况下是一个数字还是一对数字?
  • @Ben 它是唯一不作为 + 和 - 值出现的数字?
  • 你的号码总是这样配对吗?或者一个数字的负值可能更远或在正值之后?例如,您可以简单地在列上使用 sum() 来获取(单个)值 - 如果您有多个唯一数字,这将不起作用。如果你得到 (-10,10,-10) - 报告 -10 怎么办?
  • 8 117.96 .. 一些自然语言使用 , 作为十进制分隔符 - 我猜 Suno 会说其中之一 ;)
  • @PatrickArtner 最后一行 8 117.96 是 mozway 编辑的结果。在原版中,所有内容都以不明确的逗号分隔符呈现。我觉得很可能mozway的解释是正确的,但这确实是需要验证的那种东西。

标签: python excel pandas numpy


【解决方案1】:

假设您在此列中有浮点数,您可以将行与下一行的相反行进行比较,并使用此信息仅对这些行进行子集化。

# is the next row the opposite value?
m = df['col'].eq(-df['col'].shift())

# drop the matching rows and the next ones
df2 = df.loc[~(m|m.shift(-1))]

输出:

      col
8  117.96

使用过的输入:

      col
0 -142.60
1  142.60
2 -565.78
3  565.78
4  -90.00
5   90.00
6   63.26
7  -63.26
8  117.96

【讨论】:

  • 您有什么理由决定使用.eq 而不是== 运算符?
  • @BenGrossmann 不,你可以同时使用这两种效果,我就是喜欢它;)
【解决方案2】:

从上下文中不清楚“对应的负数”是否一定与实际数字相邻。如果负数可能不在正数旁边,而只是在数组中的某个位置,我们可以执行以下操作。这里,df 是根据 Excel 数据构造的数据框。

# builds the same table with an additional column '_merge'.
# '_merge' column will be 'left_only' for rows whose negative
# does not appear and 'both' otherwise

df_all = df.merge(-df, how='left', indicator=True)

# selects rows with 'left_only' label

df = df.loc[df_all['_merge']=='left_only']

输入:

        0
0  -63.26
1  117.96
2 -565.78
3   63.26
4  142.60
5  565.78
6   90.00
7  -90.00
8 -142.60

输出:

        0
1  117.96

【讨论】:

    最近更新 更多