Python 使用str.rsplit格式化列会将某些列名更改为NAN

Python 使用str.rsplit格式化列会将某些列名更改为NAN,python,pandas,dataframe,split,rename,Python,Pandas,Dataframe,Split,Rename,我有一个数据集,它的列名与下面类似,但有更多的“凌乱”列 我的目标是重新命名凌乱的列,只保留“我想要什么” 我使用了df.columns=df.columns.str.rsplit('.').str[1],但这将前3个列名更改为NAN 我尝试过使用for循环 for col in df.columns[3:]: df.columns = df.columns.str.rsplit('.').str[1] if语句 if '.' in df.columns: df.columns

我有一个数据集,它的列名与下面类似,但有更多的“凌乱”列

我的目标是重新命名凌乱的列,只保留“我想要什么”

我使用了
df.columns=df.columns.str.rsplit('.').str[1]
,但这将前3个列名更改为NAN

我尝试过使用for循环

for col in df.columns[3:]:
    df.columns = df.columns.str.rsplit('.').str[1]
if语句

if '.' in df.columns:
    df.columns = df.columns.str.rsplit('.').str[1]
和一个组合

for col in df.columns:
    if '.' in col:
        df.columns = df.columns.str.rsplit('.').str[1]
但是,当我以这些方式运行它时,它最多只能运行,但不会对任何列应用
rsplit
,最坏的情况是,我得到
“str”对象没有属性“str”
,这是一个错误,具体取决于具体的代码(我尝试了很多方法)

在找不到解决方案后,我决定使用

df = df.rename(columns= {df.columns[0]: 'name', df.column[1]: 'info', df.columns[2]: 'date'}) 
但是,这将所有3列更改为“名称”

我还尝试过使用
df.rename
3次,但结果都是相同的问题

如果我切换顺序,使
df.columns[1]:“info”
位于第一位,则所有名称都更改为“info”,如果
df.columns[2]
位于第一位,则“date”的名称相同

理想情况下,我希望解决方案只对所需列应用
rsplit
,这样我就不必重新输入列名

以下是实际列名的示例:

tpm.ARPE-19_EMT_induced_with_TGF-beta_and_TNF-alpha_03hr00min_biol_rep3.CNhs14493.13654-147B9.hg38.nobarcode
我想保留的部分是

ARPE-19_EMT_induced_with_TGF-beta_and_TNF-alpha_03hr00min_biol_rep3
与给定的
regex
模式一起使用,从杂乱的列名中提取列名,然后使用从
df.columns
cols
中选择列,具体取决于提取的列不是
NaN

cols = df.columns.str.extract(r'\.([^\.]+)\.', expand=False)
df.columns = np.where(cols.notna(), cols, df.columns)
示例
df

df = pd.DataFrame(columns=['name', 'info', 'date', 'pb.l.what_i_want_.n', 'pb.l.what_i_want_.d' ])
结果:

# print(df.columns)
Index(['name', 'info', 'date', 'what_i_want_', 'what_i_want_'], dtype='object')
正则表达式解释:

  • \。
    按字面意思匹配字符

  • 第一个捕获组
    ([^\.]+)

    • 匹配下面列表中不存在的单个字符[^\.]+
    • +
      量词-在一次和无限次之间进行匹配,尽可能多地匹配,根据需要返回(贪婪)

  • 更新后的列名是什么,可以在帖子中包含吗?您修改的列数是所有
    for
    循环中列数的两倍。这就是说,当
    str[1]
    最终无需抓取时,它将产生
    NaN
    。此外,当您使用
    拆分
    name
    时,您希望第二个元素是什么(即
    str[1]
    )?str[1]给我“我想要什么”,这就是我完成后希望列名是什么。我无法实现这一点。当I
    print(df.columns)
    。我相信这是因为我的列名与我提供的示例不同,所以我编辑了这个问题,以包括实际列名的示例和我想要保留的部分。如何编辑正则表达式以使其适用于这些名称?我以前从未使用过正则表达式,所以我不确定要更改什么。是的!成功了!非常感谢。你介意解释一下正则表达式和每个字符的作用吗?非常感谢!!
    # print(df.columns)
    Index(['name', 'info', 'date', 'what_i_want_', 'what_i_want_'], dtype='object')