【问题标题】:Nested loop over columns in a dataframe python数据框python中列的嵌套循环
【发布时间】:2019-03-31 22:26:42
【问题描述】:

我有以下数据框

print(df1)

        Date    start          end    delta d1   x_s    y_s      z_s    x_f      y_f    z_f
0   09/01/2017  09/01/2017  06/02/2017  28  28  0.989   0.945   0.626   0.191   0.932   0.280
1   10/01/2017  09/01/2017  06/02/2017  27  28  0.989   0.945   0.626   0.191   0.932   0.280
2   11/01/2017  09/01/2017  06/02/2017  26  28  0.989   0.945   0.626   0.191   0.932   0.280
3   12/01/2017  09/01/2017  06/02/2017  25  28  0.989   0.945   0.626   0.191   0.932   0.280
4   13/01/2017  09/01/2017  06/02/2017  24  28  0.989   0.945   0.626   0.191   0.932   0.280
5   14/01/2017  09/01/2017  06/02/2017  23  28  0.989   0.945   0.626   0.191   0.932   0.280
6   15/01/2017  09/01/2017  06/02/2017  22  28  0.989   0.945   0.626   0.191   0.932   0.280
7   16/01/2017  09/01/2017  06/02/2017  21  28  0.989   0.945   0.626   0.191   0.932   0.280
8   17/01/2017  09/01/2017  06/02/2017  20  28  0.989   0.945   0.626   0.191   0.932   0.280
9   18/01/2017  09/01/2017  06/02/2017  19  28  0.989   0.945   0.626   0.191   0.932   0.280

df1['delta'] = df1['end'] - df1['Date']df1['d1'] = df['end']-df1['start'] 我想创建 3 个新列,其中显示对 (x_s, x_f)、(y_s, y_f) 和 (z_s, z_f) 之间的插值。

我试过下面的代码

def mapper (name):
     return name+'_i'

ss = list(df1[['x_s', 'y_s', 'z_s']])
fs = list(df1[['x_f', 'y_f', 'z_f' ]])
df2 = pd.DataFrame

for s in ss :
    for f in fs:
         df2[s] = df1[s] + (((df1[f] - df1[s])/df1['d1'])*df1['delta'])

df_conc = pd.concat((df1, df2_new), axis=1)

但是,当我尝试运行嵌套循环时,出现以下错误:

TypeError: 'type' object does not support item assignment

我想知道我做错了什么。我将不胜感激任何提示或建议。提前非常感谢!

第二次尝试:

ss = ('x', 'y', 'z') 

for s in ss: 
   df1[mapper(s)] = pd.Series((df1[s+'_s'] + ((df1[s+'_f'] - df1[s+'_s'])/(df1['d1']))*df1['delta']), name=mapper(s), index=df1.index)  

但我仍然没有得到 3 个新列,它们循环通过以下对 (x_s, x_f)、(y_s, y_f)、(z_s, z_f)。

如果您发现我做错了什么,请告诉我,非常感谢!

【问题讨论】:

    标签: python pandas for-loop dataframe nested-loops


    【解决方案1】:

    这应该可以解决它:

    for s in ss :
        for f in fs:
            df1[mapper(s)] = pd.Series(df1[s] + (((df1[f] - df1[s])/df1['d1'])*df1['delta']), name=mapper(s), index=df1.index)
    

    我认为这就是你想要的,丢掉最后的concat 行。当您添加类似的新列时,Pandas 希望将索引传递给它,请参阅here

    您可能还需要检查列的.dtypes,并根据需要使用pd.to_datetimeThis 也可能有帮助。

    我运行了以下内容:

    df1.end = pd.to_datetime(df1.end)
    df1.start = pd.to_datetime(df1.start)
    df1.Date = pd.to_datetime(df1.Date)
    
    
    df1.delta = df1.delta / pd.offsets.Second(1)
    df1.d1 = df1.d1 / pd.offsets.Second(1)
    

    【讨论】:

    • 该代码似乎仅适用于最后一对 (z_s, z_f),而对于其他列,循环似乎只适用于 ss 列表,而适用于 fs 替代列表看起来卡在 y_f 上。我不明白为什么..
    • 它没有给出任何错误消息,但是当我查看新列中的结果时,似乎公式 df1[s] + (((df1[f] - df1[s])/df1['d1'])*df1['delta']) 正确地循环通过 x_s、y_s 和 z_f for s 但是它总是采用相同的所有 3 个实例中的 z_f 列,而不是循环通过 x_f、y_f、z_f。如果我还不够清楚,请告诉我。谢谢!
    • 如果将最后一行的s 替换为s+f,它会做你想做的事情吗?这样,您将获得 6 列而不是 3 列。
    • 我相信我需要的是某种多处理,这将使 2 个循环 ss 和 fs 同时运行
    【解决方案2】:

    我认为你不应该循环播放。让 numpy 以矢量化的方式为您完成这一切。

    ss = df[['x_s', 'y_s', 'z_s']].values
    fs = df[['x_f', 'y_f', 'z_f' ]].values
    ss2 = ss + ((ss - fs)/df[['d1']].values)*df[['delta']].values
    

    请注意,我确信您可以摆脱上面的一些 .values 但这应该说明原理

    【讨论】:

    • 嗨,丹,我收到以下错误 main:1: RuntimeWarning: 除以零在 true_divide 中遇到。但是,数据集中没有被零除。还有什么我应该检查的吗?谢谢!
    【解决方案3】:
    def mapper (name):
         return name+'_i'
    
    ss = ('x', 'y', 'z') 
    
    for s in ss: 
       df1[mapper(s)] = pd.Series((df1[s+'_s'] + ((df1[s+'_f'] - df1[s+'_s'])/(df1['d1']))*df1['delta']), name=mapper(s), index=df1.index)
    

    【讨论】:

    • 感谢您提供可能有助于解决问题的代码,但一般来说,如果答案包含对代码的用途以及解决问题的原因的解释,则会更有帮助。跨度>
    猜你喜欢
    • 2022-08-15
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多