首页 > 解决方案 > 根据条件在 Pandas 数据框中迭代和赋值

问题描述

我有一个由 8 列组成的 pandas 数据框(c1c7,最后一个被称为total)。是和。c1_c701

列总计应该是对 1 内序列中最大数量 1 的c1赋值c7c1代表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()。

标签: pythonfor-loopiteration

解决方案


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。这也可以通过将行循环两次并使用模运算符来完成。检查此算法以获取更多详细信息


推荐阅读