【问题标题】:Dynamic dataframe column name in apply function应用函数中的动态数据框列名
【发布时间】:2018-07-15 16:53:18
【问题描述】:

我正在使用当前的数据框:

df = pd.DataFrame({'columnA':[1111,1111,2222,3333,4444,4444,5555,6666],
                   'columnB':['AAAA','AAAA','BBBB','AAAA','BBBB','BBBB','AAAA','BBBB'],
                   'columnC':['one','two','one','one','one','sales','two','one'],
                   'NUM1':[1,3,5,7,1,0,4,5],
                   'NUM2':[5,3,6,9,2,4,1,1],
                   'W':list('aaabbbbb')})

我正在尝试在以下代码中使用动态列:

#First aggregate the data
d = {'columnB':'unique', 'columnC':'unique' }
df2 = df.groupby('columnA').agg(d)


#Convert list to string for each cell of the inventory field
mylist = ["columnB","columnC"]
for x in mylist:
    columnName = x
    #print("df2."+columnName+".apply(', '.join)")
    df2[columnName] = df2[columnName].apply(', '.join)

它在 Jupyter 中运行良好。我的问题是当我在visualstudio上运行它时它不起作用。我收到此错误:

序列项 0:预期的 str 实例,找到浮点数

打印数据框的类型后,我得到了这个:

<class 'pandas.core.frame.DataFrame'>

这是完整的错误信息:

Traceback(最近一次调用最后一次):文件“stage1.py”,第 112 行,在 main() 文件“stage1.py”,第 57 行,在 main templateScenarios[columnName] = templateScenarios[columnName].apply(' , '.join) 文件“/Users/apolo.siskos/anaconda3/lib/python3.6/site-packages/pandas/core/series.py”,第 2355 行,在 apply mapped = lib.map_infer(values, f, convert=convert_dtype) 文件“pandas/_libs/src/inference.pyx”,第 1574 行,在 pandas._libs.lib.map_infer 类型错误:序列项 0:预期的 str 实例,找到浮点数

【问题讨论】:

  • 您的每个解释器都使用哪些版本的 python 和 pandas?
  • 请包含完整错误信息。
  • @PaulH Python 3.6.3 和 Pandas 0.20.3
  • 两者中?你确定吗?
  • @PaulH 是的。我在控制台中输入了 python3 并得到了第一个。我在我的脚本中打印了这个:pd.__version__ 并得到了第二个。

标签: python pandas


【解决方案1】:

NaNs 值存在问题,因此可以通过 dropna 删除它们并使用 join 的自定义函数:

df = pd.DataFrame({'columnA':[1111,1111,2222,3333,4444,4444,5555,6666],
                   'columnB':[np.nan,np.nan,'BBBB','AAAA','BBBB','BBBB','AAAA','BBBB'],
                   'columnC':['one','two','one','one','one','sales','two','one'],
                   'NUM1':[1,3,5,7,1,0,4,5],
                   'NUM2':[5,3,6,9,2,4,1,1],
                   'W':list('aaabbbbb')})

f = lambda x: ', '.join(x.dropna().unique())
d = {'columnB': f, 'columnC':f}
df2 = df.groupby('columnA').agg(d)
print (df2)
        columnB     columnC
columnA                    
1111               one, two
2222       BBBB         one
3333       AAAA         one
4444       BBBB  one, sales
5555       AAAA         two
6666       BBBB         one

【讨论】:

  • 为什么没有覆盖我? df2 = df2.fillna('none')
  • 它将NaNNone 替换为字符串none。您的解决方案应该可以工作,但它没有缺少值,只有字符串。
  • 我之前的一个问题,在每个单元格中返回了列表。这就是我尝试上述解决方案的原因。现在,有了你的 x.dropna() 我不再需要它了 :) 谢谢。
  • 欢迎你!
  • unique返回np.array,所以join是必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多