分栏并以Pandas命名

jq6vz3qz  于 2023-03-06  发布在  其他
关注(0)|答案(1)|浏览(132)

我有一个数据文件,其中包含时间间隔列,如0- 10、11 - 20、21 -30......、81-90。还有另外两列FH和SH。以下示例 Dataframe 代表我的部分数据:

df = pd.DataFrame()
df['Team'] = ['A','B','C']
df['0-10'] = ['4-0','2-2','3-2']
df ['11-20']= ['2-1','2-2','3-0']
df ['21-30'] = ['2-1','1-1','2-2']
df ['FH'] = ['5-3','6-6','5-5']
df ['SH'] = ['2-3','3-2','3-3']

我想做的是将元素拆分为时间间隔(0- 10,11 -20,21-30),这意味着i对于每个时间间隔[“0 - 10”]到[“0 - 10 F”和“0- 10A”]将具有两个不同的列,并且对于团队A,“0- 10 F”下的值将是4,“0- 10A”下的值将是0,我将对其他时间间隔“11-20”至“11- 20 F”和“11- 20 A”执行相同操作,我可以分别为每列编写代码,如下所示:

df ['0-10F'] = df['0-10'].str.split('-').str[0]
df ['0-10A'] = df['0-10'].str.split('-').str[1]
df ['11-20F'] = df['11-20'].str.split('-').str[0]
df ['11-20A'] = df['11-20'].str.split('-').str[1]
df ['21-30F'] = df['21-30'].str.split('-').str[0]
df ['21-30A'] = df['21-30'].str.split('-').str[1]

是否有更好的方法用一个通用代码为所有列编写它。以下是预期输出:

hkmswyz6

hkmswyz61#

使用DataFrame.filter表示列名为-的列,按每列循环并使用Series.str.split创建新的DataFrame,如有必要,将值转换为整数:

for c in df.filter(like='-').columns:
    df[[f'{c}F', f'{c}A']] = df[c].str.split('-', expand=True).astype(int)

print (df)
  Team 0-10 11-20 21-30   FH   SH  0-10F  0-10A  11-20F  11-20A  21-30F  \
0    A  4-0   2-1   2-1  5-3  2-3      4      0       2       1       2   
1    B  2-2   2-2   1-1  6-6  3-2      2      2       2       2       1   
2    C  3-2   3-0   2-2  5-5  3-3      3      2       3       0       2   

   21-30A  
0       1  
1       1  
2       2

相关问题