【问题标题】:Unpacking a tuple on multiple columns of a dataframe from Series.apply从 Series.apply 解压缩数据框多列上的元组
【发布时间】:2019-06-26 15:07:52
【问题描述】:

我今天在工作中遇到了这个问题,我想知道是否有有效的方法来解决这个问题。

基本上我有一个看起来像这样的数据框

df = pd.DataFrame([1,2,3], columns = ['a'])

我还有一个返回元组的函数。 (请注意,这只是一个最小的例子,我的问题是不同的)

compute = lambda x: (2*x, 3*x)

我需要找到一种方法来做一些理想情况下看起来像这样的事情:

(df['b'], df['c']) = df['a'].apply(compute)

不幸的是,这种语法不起作用,我无法用另一种方式来实现它。

唯一类似的问题是this ,但该解决方案似乎真的很“hacky”,我相信有更好的方法来做到这一点。

谢谢!!

【问题讨论】:

  • 可以做类似df['b'], df['c'] = zip(*df['a'].map(compute))的事情,但它可能会比只使用矢量化方法来创建每个要慢。

标签: python pandas dataframe tuples


【解决方案1】:

IIUC,你可以试试:

compute = lambda x: (2*x, 3*x)
df[['b','c']]=pd.DataFrame(df.a.apply(compute).tolist()) #thanks harvpan
#df[['b','c']]=pd.DataFrame(df.a.apply(compute).values.tolist())
print(df)

   a  b  c
0  1  2  3
1  2  4  6
2  3  6  9

【讨论】:

  • 只要pd.DataFrame(df['a'].apply(compute).to_list()) 就可以了。
【解决方案2】:

另一种方式

df=df.reindex(columns=df.columns.tolist()+['b','c'])
df[['b','c']]=list(map(compute,df.a))
df
Out[107]: 
   a  b  c
0  1  2  3
1  2  4  6
2  3  6  9

【讨论】:

    猜你喜欢
    • 2018-07-04
    • 2020-12-12
    • 2019-11-19
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2014-07-13
    • 2020-03-12
    相关资源
    最近更新 更多