【问题标题】:Iterate and assign value in Pandas dataframe based on condition根据条件在 Pandas 数据框中迭代和赋值
【发布时间】:2019-07-27 19:21:18
【问题描述】:

我有一个由 8 列组成的 pandas 数据框(c1 到 c7,最后一个称为 total)。 c1 到 c7 是 0 和 1。

列总数应为c1 到c7 内的序列中的最大数1 的赋值。 c1 到 c7 代表工作日,因此 7 应翻转为 1。

例如,如果我们有像df这样的初始数据框:

| c1 | c2 | c3 | c4 | c5 | c6 | c7 | total |
|:---|:---|:---|: --|:---|:---|:---|:-----:|
| 1  | 1  | 1  | 1  | 1  | 0  | 0  |  0    |
| 0  | 0  | 1  | 0  | 0  | 0  | 0  |  0    |
| 1  | 1  | 0  | 1  | 1  | 0  | 0  |  0    |
| 1  | 1  | 1  | 0  | 1  | 1  | 1  |  0    |
| 1  | 0  | 1  | 1  | 1  | 0  | 1  |  0    |
| 1  | 0  | 1  | 0  | 1  | 0  | 1  |  0    |
| 0  | 1  | 0  | 1  | 0  | 1  | 0  |  0    |

我最初的想法是创建一个带有 if 语句的循环,以评估列中的条件并将值分配给列总计。

i = "c1"
d = 
for i in df.iloc[:,0:7]:
    if df[i] == 1 and df[i-1] == 1:
    df["total"]:= df["total"] + 1

我希望 df 看起来像:

| c1 | c2 | c3 | c4 | c5 | c6 | c7 | total |
|:---|:---|:---|: --|:---|:---|:---|:-----:|
| 1  | 1  | 1  | 1  | 1  | 0  | 0  |  5    |
| 0  | 0  | 1  | 0  | 0  | 0  | 0  |  1    |
| 1  | 1  | 0  | 1  | 1  | 0  | 0  |  2    |
| 1  | 1  | 1  | 0  | 1  | 1  | 1  |  6    |
| 1  | 0  | 1  | 1  | 1  | 0  | 1  |  3    |
| 1  | 0  | 1  | 0  | 1  | 0  | 1  |  2    |
| 0  | 1  | 0  | 1  | 0  | 1  | 0  |  1    |

我无法得到结果,正在尝试逐步构建,但在 if 语句评估中不断出错

ValueError:Series 的真值不明确。使用a.empty, a.bool()、a.item()、a.any() 或 a.all()。

【问题讨论】:

  • 最后一行的预期结果不应该是 1 吗?如果是2,你能解释一下为什么吗?
  • 是的,很抱歉,确实是 1

标签: python for-loop iteration


【解决方案1】:
df = pd.DataFrame([[ 1,1,1,1,1,0,0], [0,0,1,0,0,0,0],[1,1,0,1,1,0,0]])

def fun(x):
    count = 0; 
    result = 0; 
    n = len(x)
    for i in range(0,2*n):
        if x[i % n] == 0:
            result = max(result, count)
            count = 0
        else:
            count += 1
    return result

df['total'] = df.apply(lambda x: fun(x), axis=1)
    0   1   2   3   4   5   6   total
0   1   1   1   1   1   0   0   5
1   0   0   1   0   0   0   0   1
2   1   1   0   1   1   0   0   2

循环中的错误

  1. df[i-1] 当 i==0 时会抛出错误
  2. df[i] 给出所有行的第 i 列的值
  3. 7 should then flip to 1:您的代码中缺少这部分

要将行的尾部 (7) 翻转回头部 (1),请将行的副本放在尾部,然后检查本构 1。这也可以通过将行循环两次并使用模运算符来完成。查看algorithm了解更多详情

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 2017-06-17
    • 2020-12-01
    • 2020-12-22
    • 2021-09-17
    • 1970-01-01
    相关资源
    最近更新 更多