【问题标题】:insert a new row in the existing column based on conditions in pandas df根据 pandas df 中的条件在现有列中插入新行
【发布时间】:2023-03-24 11:35:01
【问题描述】:

样本df

| count |   A  |  
|-------|------|
| yes   |  NaN | 
| yes   |  NaN  | 
| yes   |  40  |
| yes   |  40  |
| yes   |  40  |
| yes   |  23  |

我想要的结果 -> 在类似 A 值的末尾插入“结果”

| count |   A  |  
|-------|------|
| yes   |  NaN  | 
| yes   |  NaN  | 
| result|      |
| yes   |  40  |
| yes   |  40  |
| yes   |  40  |
| result|      |
| yes   |  23  |
| rseult|      |

【问题讨论】:

  • 您想将结果放在同一个数据框中,还是也可以是一个新的数据框,其中包含 A 中所有值的结果?你的结果应该代表什么?看起来像是 groupby 的案例
  • 要在相同的 df 中得到结果 - 我的结果将是在列 A 的每个相似值之后在列 'count' 中添加一个新行 'result',我们还必须对 nan 值进行分组跨度>
  • 我是否理解您想要计算相似值的权利,所以在您的示例中,第一个 resultrow 将在新列 count 中有一个条目,其中包含 2(对于 2 个 nans)下一个 3(3 40s)和最后一个 1(一个 23)
  • 是的,你没看错@FlorianD。
  • 也许仍然考虑去groupby.count()

标签: python pandas dataframe group-by


【解决方案1】:
  • 为了保持秩序,已选择使用fillna() 而不是dropna=Falsegroupby()
  • 简单的append() 到每个组
df = pd.read_csv(io.StringIO("""count   A
yes NaN
yes NaN
yes 40
yes 40
yes 40
yes 23"""),sep="\t")

df = (df.fillna(-100)
 .groupby("A", as_index=False).apply(lambda dfa: dfa.append({"count":"result"}, ignore_index=True))
 .replace({-100:np.nan})
 .reset_index(drop=True)
)

结果:

|    | count   |   A |
|---:|:--------|----:|
|  0 | yes     | nan |
|  1 | yes     | nan |
|  2 | result  | nan |
|  3 | yes     |  23 |
|  4 | result  | nan |
|  5 | yes     |  40 |
|  6 | yes     |  40 |
|  7 | yes     |  40 |
|  8 | result  | nan |

【讨论】:

  • 输入中有两行NaN,输出中有两行附加结果行
猜你喜欢
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
相关资源
最近更新 更多