【问题标题】:How to make a for loop on two and more dataframe?如何在两个或更多数据帧上进行 for 循环?
【发布时间】:2022-01-14 20:53:02
【问题描述】:

我正在尝试对两个数据帧调用 df 和 df2 执行 for 循环。数据框每两列都包含价格。我正在尝试计算每个数据框中每个价格的 z 分数。所以最后,每个数据框现在将有四列。我有一个代码可以做到这一点,但它也创建了第三个数据框......为什么?

这是我的两个数据框的示例:

import pandas as pd
import numpy as np

df = pd.DataFrame(
         {"date": ["2021-01-31","2021-02-28", "2021-03-31","2021-04-30"],
          "Price1": [25, 30, 50, 10],
          "Price2": [30, 25, 50, 100]})
df.set_index("date", inplace=True)
df.index = pd.to_datetime(df.index)

df2 = pd.DataFrame(
         {"date": ["2021-01-31","2021-02-28", "2021-03-31","2021-04-30"],
          "Price1": [25, 30, 50, 10],
          "Price2": [30, 25, 50, 100]})
df2.set_index("date", inplace=True)
df2.index = pd.to_datetime(df2.index)

这是我想要的结果:

print(df)
             Price1   Price2  Price1_z   Price2_z      
2021-01-31      25      30   -0.262111  -0.716465                       
2021-02-28      30      25     0.087370 -0.885044                       
2021-03-31      50      50    1.485297 -0.042145                       
2021-04-30      10      100   -1.310556  1.643654                       

print(df2)
             Price1   Price2  Price1_z   Price2_z      
2021-01-31      25      30   -0.262111  -0.716465                       
2021-02-28      30      25     0.087370 -0.885044                       
2021-03-31      50      50    1.485297 -0.042145                       
2021-04-30      10      100   -1.310556  1.643654      

我的问题是它正在为列表中的最后一个数据帧创建第三个数据帧名称 frame = -> df2。

如果您在下面运行此代码,您会看到何时执行 print(df, df2, frame):

import pandas as pd
import numpy as np

df = pd.DataFrame(
         {"date": ["2021-01-31","2021-02-28", "2021-03-31","2021-04-30"],
          "Price1": [25, 30, 50, 10],
          "Price2": [30, 25, 50, 100]})
df.set_index("date", inplace=True)
df.index = pd.to_datetime(df.index)

df2 = pd.DataFrame(
         {"date": ["2021-01-31","2021-02-28", "2021-03-31","2021-04-30"],
          "Price1": [25, 30, 50, 10],
          "Price2": [30, 25, 50, 100]})
df2.set_index("date", inplace=True)
df2.index = pd.to_datetime(df2.index)

for frame in [df,df2]:
    cols = list(frame.columns)
    for col in cols:
        col_zscore = col + '_z'
        frame[col_zscore] = (frame[col] - frame[col].mean())/frame[col].std(ddof=0)

print(df,df2,frame)

如何获得相同的结果但不创建第三个数据框?谢谢!

【问题讨论】:

  • 没有第三个数据框;你正在打印print(df,df2,frame)。当frame 引用df2 时,您还能期待什么?
  • 如果您在没有 print(df,df2,frame) 的情况下在 python 控制台中打印代码,您可以清楚地看到有 3 个数据帧。一个名字df,一个名字df2,一个名字frame

标签: python pandas dataframe for-loop


【解决方案1】:

我的理解是,这是 Python 中 for 列表的标准行为,但如果它给您带来问题,您可以通过两种方式解决它。选项1,在循环后立即删除变量帧:

del frame

或者,您可以创建一个引用 df 和 df2 的 DataFrame 列表,然后对其进行循环:

import pandas as pd
import numpy as np

df = pd.DataFrame(
         {"date": ["2021-01-31","2021-02-28", "2021-03-31","2021-04-30"],
          "Price1": [25, 30, 50, 10],
          "Price2": [30, 25, 50, 100]})
df.set_index("date", inplace=True)
df.index = pd.to_datetime(df.index)

df2 = pd.DataFrame(
         {"date": ["2021-01-31","2021-02-28", "2021-03-31","2021-04-30"],
          "Price1": [25, 30, 50, 10],
          "Price2": [30, 25, 50, 100]})
df2.set_index("date", inplace=True)
df2.index = pd.to_datetime(df2.index)

dflist = [df, df2]

for num in range(len(dflist)):
    cols = list(dflist[num].columns)
    for col in cols:
        col_zscore = col + '_z'
        dflist[num][col_zscore] = (dflist[num][col] - dflist[num][col].mean())/dflist[num][col].std(ddof=0)

希望对您有所帮助!

【讨论】:

    【解决方案2】:

    你用不同的指针引用同一个对象。

    考虑以下代码。在循环中,abc 都被 letter 引用。

    a = 10
    b = 20
    c = 30
    
    for letter in [a,b,c]:
        pass
    
    print(letter)
    # 30
    
    print(c is letter)
    # True
    

    在最后一次迭代中,字母指向变量c,并且在循环结束后仍然指向它。我们可以使用print(c is letter) 确认这一点。


    在您提供的代码中,我们可以看到df2frame 是相同的。这可以通过将print(df2 is frame) 附加到代码块来确认。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(
             {"date": ["2021-01-31","2021-02-28", "2021-03-31","2021-04-30"],
              "Price1": [25, 30, 50, 10],
              "Price2": [30, 25, 50, 100]})
    df.set_index("date", inplace=True)
    df.index = pd.to_datetime(df.index)
    
    df2 = pd.DataFrame(
             {"date": ["2021-01-31","2021-02-28", "2021-03-31","2021-04-30"],
              "Price1": [25, 30, 50, 10],
              "Price2": [30, 25, 50, 100]})
    df2.set_index("date", inplace=True)
    df2.index = pd.to_datetime(df2.index)
    
    for frame in [df,df2]:
        cols = list(frame.columns)
        for col in cols:
            col_zscore = col + '_z'
            frame[col_zscore] = (frame[col] - frame[col].mean())/frame[col].std(ddof=0)
            
    print(df2 is frame)
    # True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-23
      • 2022-11-30
      • 2020-09-26
      • 2018-05-19
      • 2021-01-07
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多