繁体   English   中英

在循环和 output 中分别处理多个数据帧 pandas

[英]process multiple data frames in loop and output separately pandas

我有两个单独的数据框,我想对两者做同样的事情。 我想根据下划线(a,b,x,y)之前的第一个substring对列进行配对,然后如果第一列中的值包含一个单词,但总计列中的对应行是null,我想要将总数更新为零。 我想分别更新数据帧和 output 它们。

import pandas as pd
import numpy as np

d1 = pd.DataFrame(data={'a':['yes', 'no', 'maybe', 'sometimes', np.nan],
                        'a_total': [5,12,4,np.nan,0],
                        'b': ['blue','orange','pink', np.nan, np.nan],
                        'b_total': [12,6,0,0, np.nan]})

d2 = pd.DataFrame(data={'y':['frog', 'snail', 'snake', 'spider', 'pig'],
                        'y_total': [182,32,13, np.nan,8],
                        'z': ['car','bike','walk', np.nan, np.nan],
                        'z_total': [12,6,np.nan,np.nan, np.nan]})

然后我想对两个数据帧做点什么,然后 output 分别更新版本。 我在下面复制的当前代码没有正确输出。 我正在尝试 output 一个数据帧的字典,但如果我可以只是 output 两个数据帧(d1 和 d2)以某种方式也将是好的。

out = {}
for i, df in enumerate([d1, d2]):        
    key_id = [*df.loc[:,~df.columns.str.endswith('total')].columns]
    totals = [*df.loc[:,df.columns.str.endswith('total')].columns]
    for col in key_id: 
        pairs = df.loc[:, df.columns.str.startswith(col)]
        pairs[col+'_total'].loc[(pairs[col].notnull()) & (pairs[col+'_total'].isnull())] = 0
    out[i] = pd.concat([pairs], axis=1)

谢谢你看

不确定我是否完全理解您对 output 的需求,但也许这可行?

import pandas as pd
import numpy as np

d1 = pd.DataFrame(data={'a':['yes', 'no', 'maybe', 'sometimes', np.nan],
                        'a_total': [5,12,4,np.nan,0],
                        'b': ['blue','orange','pink', np.nan, np.nan],
                        'b_total': [12,6,0,0, np.nan]})

d2 = pd.DataFrame(data={'y':['frog', 'snail', 'snake', 'spider', 'pig'],
                        'y_total': [182,32,13, np.nan,8],
                        'z': ['car','bike','walk', np.nan, np.nan],
                        'z_total': [12,6,np.nan,np.nan, np.nan]})

#show d1 before making changes
print(d1)

#make the changes directly to d1 and d2
for i, df in enumerate([d1, d2]):        
    cols = [c for c in df.columns if not c.endswith('total')]
    
    for col in cols: 
        tot_col = col+'_total'    
        df.loc[df[col].notnull() & df[tot_col].isnull(), tot_col] = 0
    
    
#show d1 after making changes
print(d1)

d1 更改前:

           a  a_total       b  b_total
0        yes      5.0    blue     12.0
1         no     12.0  orange      6.0
2      maybe      4.0    pink      0.0
3  sometimes      NaN     NaN      0.0
4        NaN      0.0     NaN      NaN

d1 更改后:

           a  a_total       b  b_total
0        yes      5.0    blue     12.0
1         no     12.0  orange      6.0
2      maybe      4.0    pink      0.0
3  sometimes      0.0     NaN      0.0
4        NaN      0.0     NaN      NaN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM