【问题标题】:'Error: Can't assign to function call' while using eval() function in python在 python 中使用 eval() 函数时出现“错误:无法分配给函数调用”
【发布时间】:2017-11-22 07:43:11
【问题描述】:

我正在尝试运行 2 个嵌套循环将数据从 1 个巨大的数据帧(例如数据)中分离到 12 个单独的数据帧中。 “数据”有列(leaf1、leaf2、leaf3、leaf4、..、leaf12)。我创建了 12 个不同的数据框,名称分别为 leaf1、leaf2、leaf3 ...、leaf12。我正在检查主数据框的每一行。如果该行不是“NaN”,那么我将使用以下代码将其附加到新创建的数据帧之一中:

leaf1 = pd.DataFrame()
leaf2 = pd.DataFrame()
.
.
.
leaf12 = pd.DataFrame()

list1 = ['leaf1', 'leaf2',...,'leaf12']
for i in list1:
    temp1 = data[[i]]
    if temp1.isnull().any().any() == False:
        eval(i) = eval(i).append(temp1)

在最后一行中,我需要将字符串转换为变量,然后将数据帧附加到该变量中。但是,我收到一个错误。请帮忙。

【问题讨论】:

    标签: python-3.x pandas loops dataframe


    【解决方案1】:

    我认为最好将其转换为dictionary of DataFrames:

    np.random.seed(1997)
    df = pd.DataFrame(np.random.choice([np.nan,1,5], size=(10,12)))
    df.columns = ['leaf{}'.format(x+1) for x in df.columns]
    print (df)
       leaf1  leaf2  leaf3  leaf4  leaf5  leaf6  leaf7  leaf8  leaf9  leaf10  \
    0    1.0    1.0    NaN    NaN    5.0    5.0    5.0    5.0    1.0     NaN   
    1    1.0    5.0    NaN    1.0    1.0    NaN    1.0    NaN    5.0     1.0   
    2    1.0    5.0    5.0    1.0    NaN    1.0    1.0    NaN    5.0     NaN   
    3    1.0    5.0    NaN    1.0    1.0    5.0    5.0    1.0    1.0     1.0   
    4    NaN    5.0    5.0    5.0    NaN    1.0    1.0    1.0    1.0     1.0   
    5    NaN    NaN    NaN    1.0    NaN    5.0    5.0    1.0    1.0     1.0   
    6    5.0    1.0    1.0    1.0    NaN    1.0    1.0    5.0    5.0     1.0   
    7    5.0    1.0    5.0    NaN    NaN    5.0    NaN    1.0    1.0     5.0   
    8    5.0    5.0    1.0    NaN    1.0    1.0    5.0    1.0    5.0     1.0   
    9    5.0    1.0    5.0    NaN    5.0    NaN    NaN    5.0    1.0     NaN   
    
       leaf11  leaf12  
    0     NaN     1.0  
    1     NaN     5.0  
    2     1.0     5.0  
    3     1.0     1.0  
    4     NaN     NaN  
    5     5.0     1.0  
    6     5.0     NaN  
    7     NaN     1.0  
    8     NaN     1.0  
    9     NaN     5.0  
    
    
    dfs = {c:df[[c]] if df[c].notnull().all() 
                     else pd.DataFrame(columns=[c]) for c in df.columns }
    

    同理:

    dfs = {}
    for c in df.columns:
        if df[c].notnull().all():
            dfs[c] = df[[c]] 
        else:
            dfs[c] = pd.DataFrame(columns=[c])
    

    然后通过keys选择,这里是列名:

    print (dfs['leaf1'])
       leaf1
    0    1.0
    1    1.0
    2    4.0
    3    1.0
    4    4.0
    5    1.0
    6    1.0
    7    1.0
    8    4.0
    9    1.0
    
    print (dfs['leaf3'])
    Empty DataFrame
    Columns: [leaf3]
    Index: []
    

    【讨论】:

      猜你喜欢
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多