【问题标题】:Iterating Over Pandas Dataframe Without Overwriting Previous在不覆盖以前的情况下迭代 Pandas 数据框
【发布时间】:2021-11-09 04:56:19
【问题描述】:

这里的第一篇文章寻求我无法解决的解决方案。我本质上是在尝试迭代熊猫数据框而不覆盖以前的数据框。目前,我有获取第一个实例但无法迭代下一组“值”的代码。见下文。非常感谢任何帮助!

import pandas as pd
import numpy as np

# load csv data
data = pd.read_csv(r"C:\Users\Admin\Desktop\data.csv")

# convert csv data to pandas dataframe
df = pd.DataFrame(data, columns = ["Date", "B1", "B2", "B3", "B4", "B5"]

主代码:

for n in range(1,10):
    df[n] = pd.Series(["X" if df.iat[x,y] == n else "" for y in range(1,6) for x in range(0,4)])

输出表不正确:

Date B1 B2 B3 B4 B5 1 2 3 4 5 6 7 8
8/22/19 2 3 38 39 40 X
8/25/19 5 8 16 20 25 X
8/27/19 3 4 19 35 39 X
8/29/19 1 2 6 15 19 X

正确的输出表:

Date B1 B2 B3 B4 B5 1 2 3 4 5 6 7 8
8/22/19 2 3 38 39 40 X X
8/25/19 5 8 16 20 25 X X
8/27/19 3 4 19 35 39 X X
8/29/19 1 2 6 15 19 X X X

我希望这是有道理的。谢谢!! :)

【问题讨论】:

  • 你能解释一下你到底想要做什么吗?
  • 欢迎您。请尝试生成mcve
  • 一个潜在问题:您正在遍历整个 4x5 的原始 DataFrame,但您创建的每个新列只有 4 行可用 - 这意味着您要为新列分配 20 个值只有 4 行
  • n 列是数字,而 B1-B5 是乐透数据集的中奖号码。寻找识别中奖号码的代码到 n 列的新表中以供以后使用。 n 列实际上是 52,但为了这篇文章,我减少了列

标签: python pandas numpy loops


【解决方案1】:

我认为使用apply 函数会使事情变得更容易:每当您创建一个新列时,您都会遍历 DataFrame 的每一行,如果列值为,则新列的每一行都设置为“X”包含在正在考虑的行中。为避免覆盖任何内容,您可以通过 "Date" 索引 DataFrame,并且只将此函数应用于 DataFrame 的前 5 列。

for n in range(1,10):
    df[n] = df.iloc[:,:5].apply(lambda x: "X" if n in x.values else "", axis=1)

结果:

df
         B1  B2  B3  B4  B5  1  2  3  4  5  6 7  8 9
Date                                                
8/22/19   2   3  38  39  40     X  X                
8/25/19   5   8  16  20  25              X       X  
8/27/19   3   4  19  35  39        X  X             
8/29/19   1   2   6  15  19  X  X           X   

【讨论】:

    【解决方案2】:

    让我们尝试不使用 for 循环并应用

    s = df.filter(like='B').stack()
    s = pd.crosstab(s.index.get_level_values(level=0),s).replace({0:'',1:'X'})
    s.columns = s.columns.astype(str)
    out = s.reindex(columns = df.columns).combine_first(df)
              Date   B1   B2    B3    B4    B5  1  2  3  4  5  6 7  8
    row_0                                                            
    0      8/22/19  2.0  3.0  38.0  39.0  40.0     X  X              
    1      8/25/19  5.0  8.0  16.0  20.0  25.0              X       X
    2      8/27/19  3.0  4.0  19.0  35.0  39.0        X  X           
    3      8/29/19  1.0  2.0   6.0  15.0  19.0  X  X           X     
    

    【讨论】:

      猜你喜欢
      • 2020-08-30
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2014-04-10
      相关资源
      最近更新 更多