How to fix AttributeError: 'DataFrame' object has no attribute 'assign' with out updating Pandas?

How to fix AttributeError: 'DataFrame' object has no attribute 'assign' with out updating Pandas?

我正在尝试根据键 ('r_id') 合并多个文件,并使用文件名重命名输出中的列名。除了用文件名重命名输出之外,我可以做任何事情。我有以下错误,可能是由 Pandas 的旧版本引起的。有谁知道如何在不更新 pandas 到新版本的情况下解决这个问题?

错误

    Traceback (most recent call last):                                       
      File "multijoin_2.py", line 19, in <module>                            
        result = merge_files(files).reset_index()                            
      File "multijoin_2.py", line 11, in merge_files                         
        pd.read_csv(f, sep='\t', usecols=['r_id', 'exp'])          
      File "/users/xxx/anaconda/lib/python2.7/site-packages/pandas/core/frame.py", line 2007, in __getattr__
        (type(self).__name__, name))                                                                             
AttributeError: 'DataFrame' object has no attribute 'assign'  

输入

$猫测试1

r_id       g_id exp
r1      g1      20
r2      g1      30
r3      g1      1
r4      g1      3

$猫测试2

r_id       gid exp
r1      g2      20
r2      g2      30
r3      g2      1
r4      g2      3

$猫测试3

r_id       g_id exp
r1      g3      30
r2      g3      40
r3      g3      11
r4      g3      32

期望的输出

  r_id  test3  test2  test1
0        r1        30        20        20
1        r2        40        30        30
2        r3        11         1         1
3        r4        32         3         3

工作代码(列命名除外)

import os
import glob
import pandas as pd

files = glob.glob(r'/path/test*')

def merge_files(files, **kwargs):
    dfs = []
    for f in files:
        dfs.append(
            pd.read_csv(f, sep='\t', usecols=['r_id', 'exp'])
              #.assign(col=0)
              .rename(columns={'col_name':os.path.splitext(os.path.basename(f))[0]})
              .set_index(['repeat_id'])
        )
    return pd.concat(dfs, axis=1)


result = merge_files(files).reset_index()
print(result)

您需要更改 exp 作为重命名的列名称:

def merge_files(files, **kwargs):
    dfs = []
    for f in files:
        dfs.append(
            pd.read_csv(f, sep='\t', usecols=['r_id', 'exp'], index_col=['r_id'])
              .rename(columns={'exp':os.path.splitext(os.path.basename(f))[0]})
        )
    return pd.concat(dfs, axis=1)

result = merge_files(files).reset_index()
print(result)
  r_id  test1  test2  test3
0   r1     20     20     30
1   r2     30     30     40
2   r3      1      1     11
3   r4      3      3     32