为所有数据框列名添加一个数字,但列名和由字符串和整数组成

2024-10-01 13:36:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要通过在名称内的所有数字中添加1来重命名我的所有列名称

问题是,每个列名都由文本和数字的多个部分组成,我希望在输出时保留这些部分

下面的输入示例:

^{tb1}$

所需输出为:

^{tb2}$

为了节省时间,您可以使用以下命令生成示例输入:

data = [[1, 2, 4], [3, 5, 4], [2, 7, 6]] 
df = pd.DataFrame(data, columns = ["ARG15 - ILE10 vdW", "VAL16 - ILE10 vdW", "VAL16 - VAL19 vdW"]) 

如果有帮助的话,我在现实生活中的列名都具有与上面所示相同的格式:“text”“number”“-”“text”“number”“text”,因此一个更具体的解决方案就可以了

(我正在使用python 3.8)

谢谢


Tags: text文本命令名称示例numberdata数字
2条回答

这个稍长一点,但你也可以试试

# Create DataFrame from current column headers
df_cols = pd.DataFrame(list(df.columns), columns=['Original_Names'])

    Original_Names
0   ARG15 - ILE10 vdW
1   VAL16 - ILE10 vdW
2   VAL16 - VAL19 vdW

# Split names into to parts based on hyphen
df_cols['Val_1'] = df_cols['Original_Names'].str.split('-').str.get(0)
df_cols['Val_2'] = df_cols['Original_Names'].str.split('-').str.get(1)

    Original_Names      Val_1   Val_2
0   ARG15 - ILE10 vdW   ARG15   ILE10 vdW
1   VAL16 - ILE10 vdW   VAL16   ILE10 vdW
2   VAL16 - VAL19 vdW   VAL16   VAL19 vdW

# Split Val_1 with regular expression to extract the number
df_cols['V1_num'] = df_cols['Val_1'].str.split('\w{3}').str.get(1)
df_cols['V2_num'] = df_cols['Val_2'].str.split('\w{3}').str.get(1)

    Original_Names  Val_1   Val_2   V1_num  V2_num
0   ARG15 - ILE10 vdW   ARG15   ILE10 vdW   15  10
1   VAL16 - ILE10 vdW   VAL16   ILE10 vdW   16  10
2   VAL16 - VAL19 vdW   VAL16   VAL19 vdW   16  19

# Add 1 to number in both columns
df_cols['V1_num_updtd'] = df_cols['V1_num'].astype(int) + 1
df_cols['V2_num_updtd'] = df_cols['V2_num'].astype(int) + 1

    Original_Names  Val_1   Val_2   V1_num  V2_num  V1_num_updtd    V2_num_updtd
0   ARG15 - ILE10 vdW   ARG15   ILE10 vdW   15  10  16  11
1   VAL16 - ILE10 vdW   VAL16   ILE10 vdW   16  10  17  11
2   VAL16 - VAL19 vdW   VAL16   VAL19 vdW   16  19  17  20

# Join split out data back together in new column
df_cols['New_Names'] = (df_cols['Val_1'].str.split('\d{2}').str.get(0) + 
 df_cols['V1_num_updtd'].astype(str) + ' -' +
 df_cols['Val_1'].str.split('\d{2}').str.get(1) +
 df_cols['Val_2'].str.split('\d{2}').str.get(0) + 
 df_cols['V2_num_updtd'].astype(str) + 
 df_cols['Val_2'].str.split('\d{2}').str.get(1))

Original_Names  Val_1   Val_2   V1_num  V2_num  V1_num_updtd    V2_num_updtd    New_Names
0   ARG15 - ILE10 vdW   ARG15   ILE10 vdW   15  10  16  11  ARG16 - ILE11 vdW
1   VAL16 - ILE10 vdW   VAL16   ILE10 vdW   16  10  17  11  VAL17 - ILE11 vdW
2   VAL16 - VAL19 vdW   VAL16   VAL19 vdW   16  19  17  20  VAL17 - VAL20 vdW

# Update columns on original DataFrame to transformed names
df.columns = list(df_cols['New_Names'])

ARG16 - ILE11 vdW   VAL17 - ILE11 vdW   VAL17 - VAL20 vdW
0   1   2   4
1   3   5   4
2   2   7   6

您已经注意到,列是固定格式的

  • 转置,因为操作行比操作列更简单
  • 使用正则表达式解析出组件
  • 根据您的需求重新构建
  • set_index()具有新值
  • 转置以返回到原始结构
import re
myre = re.compile("^([A-Z]+)([0-9]+) - ([A-Z]+)([0-9]+) ([A-Z,a-z]+)$")

data = [[1, 2, 4], [3, 5, 4], [2, 7, 6]] 
df = pd.DataFrame(data, columns = ["ARG15 - ILE10 vdW", "VAL16 - ILE10 vdW", "VAL16 - VAL19 vdW"]) 
df = (df.T.assign(bits=lambda dfa: dfa.index)
 .assign(bits=lambda dfa: dfa.bits.apply(lambda s: "".join([f"{a}{int(b)+1} - {c}{int(d)+1} {e}" 
                                                            for a, b, c, d, e in re.findall(myre, s)])))
 .set_index("bits")
 .T
)
^{tb1}$

相关问题 更多 >