【问题标题】:Python writing to Dataframe within a functionPython 在函数中写入 Dataframe
【发布时间】:2020-03-19 22:49:28
【问题描述】:

我确信这一定是直截了当的,但是几天来一直在尝试解决这个问题,我想我知道自己做错了什么,但想法却很困难:

我正在使用一个函数来对 Dataframe 进行子集化,并基于该子集在该子集中创建一个新列并填充它。这可行,但除非我将其分配回名为 mod_df 的新数据框,否则我无法将其恢复为 df

好像函数结束后,数据丢失了。

希望有任何想法

mod_df = []

def Pop_Gen(lower, upper, val):
    x = df[(df['byear'] >= lower) &  (df['byear'] <= upper)].assign(Gen = val)
    mod_df.append(x)

for index, row in gen_Ref_df.iterrows():
    Pop_Gen(row.lower,row.upper,row.val)

输入

第一个数据帧:

df:

   Name  byear  
0  John  1980  
1  Mary  1990 

第二个数据框:

gen_Ref_df:

   val   lower   upper  
0  old   1970    1985  
1  new   1986    1995

电流输出

mod_df:

   Name  byear Gen  
0  John  1980  old  
1  Mary  1990  new

预期输出(在df中无需放入mod_df

df:

   Name  byear Gen  
0  John  1980  old  
1  Mary  1990  new  

【问题讨论】:

标签: python function dataframe assign


【解决方案1】:

假设 dfgen_Ref_df 具有相同的行数,我会执行以下操作:

# These should be your input DataFrame

d = {'name': ['John', 'Mary'], 'byear': [1980, 1990]}
df = pd.DataFrame(data=d)

d = {'val': ['old', 'new'], 'lower': [1970, 1986], 'upper': [1985, 1995]}
gen_Ref_df = pd.DataFrame(data=d)


# Replace the for loop and the function call with a single line
# Create a new column 'Gen' in df and populate each row with the Gen val obtained by the two conditions 
df['Gen'] = gen_Ref_df[(df['byear'] >= gen_Ref_df.lower) & (df['byear'] <= gen_Ref_df.upper)].assign(Gen = gen_Ref_df.val).Gen

print(df)

结果

   name  byear  Gen
0  John   1980  old
1  Mary   1990  new

【讨论】:

  • 谢谢,但我可能没有很好地解释这个问题。我正在尝试在 df 中创建一个名为“Gen”的新列,而无需像 mod_df 那样先保存到另一个 df。如果我尝试 df = mod_df.append(x) 我会收到错误“分配前引用的局部变量 'df'”
  • 你试过df['Get'] = df[(df['byear'] &gt;= lower) &amp; (df['byear'] &lt;= upper)].assign(Gen = val)
  • 得到以下ValueError:传递的项目数错误11,位置暗示1
  • 这可能是因为 df[(df['byear'] &gt;= lower) &amp; (df['byear'] &lt;= upper)].assign(Gen = val) 返回的是一个 DataFrame 而不是 np.aray (单列)。您应该更新您的问题并提供一个工作示例,其中包含传递给您实现的方法的数据
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 2014-02-07
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 2018-10-05
相关资源
最近更新 更多