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]给我“我想要什么”,这就是我完成后希望列名是什么。我无法实现这一点。当Iprint(df.columns)
。我相信这是因为我的列名与我提供的示例不同,所以我编辑了这个问题,以包括实际列名的示例和我想要保留的部分。如何编辑正则表达式以使其适用于这些名称?我以前从未使用过正则表达式,所以我不确定要更改什么。是的!成功了!非常感谢。你介意解释一下正则表达式和每个字符的作用吗?非常感谢!!
# print(df.columns)
Index(['name', 'info', 'date', 'what_i_want_', 'what_i_want_'], dtype='object')