Pandas数据帧

3
我有一个包含多个列和行的数据框,在除了最左边两列之外的所有列中,都有"整数-整数"形式的数据。我想将所有这些列拆分成两个列,每个整数在自己的单元格中,并删除破折号。
我试图按照Pandas Dataframe: Split multiple columns each into two columns中的答案操作,但似乎它们是在一个元素后拆分,而我想在“ - ”上拆分。
例如,假设我有一个数据框:

enter image description here

我希望将标记为2至22的列拆分,将它们称为2F、2A、3F、3A、...、6A,并使第一行的数据为R1、Hawthorn、229、225、91、81、...、12。
感谢您的任何帮助。
3个回答

2
您可以使用DataFrame.set_indexDataFrame.stackSeries进行操作,然后通过Series.str.split将其拆分为两个新列,转换为整数类型,并使用DataFrame.set_axis创建新的列名,再使用DataFrame.unstack进行重塑,最后使用DataFrame.sort_index按列排序并通过DataFrame.reset_index将多级索引展平为列。
#first replace columns names to default values
df.columns = range(len(df.columns))

df = (df.set_index([0,1])
        .stack()
        .str.split('-', expand=True)
        .astype(int)
        .set_axis(['F','A'], axis=1, inplace=False)
        .unstack()
        .sort_index(axis=1, level=[1,0], ascending=[True, False]))
df.columns = df.columns.map(lambda x: f'{x[1]}{x[0]}')
df = df.reset_index()
print (df)
    0                1   2F   2A   3F   3A   4F   4A   5F   5A  6F  6A
0  R1         Hawthorn  229  225   91   81  216  142  439  367   7  12
1  R2           Sydney  226  214   93   92  151  167  377  381  12   8
2  R3          Geelong  216  228   91  166  159  121  369  349  16  14
3  R4  North Melbourne  213  239  169  126  142  155  355  394   8   9
4  R5       Gold Coast  248  226  166   94  267  169  455  389  18   6
5  R6         St Kilda  242  197  118  161  158  156  466  353  15  16
6  R7        Fremantle  225  219   72   84  224  185  449  464   7   5

谢谢@jezrael。当我使用这段代码时,似乎出现了以下错误:TypeError: 只有整数标量数组可以转换为标量索引。 - TNoms
@CMor - 看起来是一些数据相关的问题,print(df.head(3).to_dict()) 是什么? - jezrael
我得到了以下内容 {(0,): ['R1', 'R2', 'R3'], (1,): ['Hawthorn', 'Sydney', 'Geelong'], (2,): ['229-225', '226-214', '210-228'], (3,): ['91-81', '93-92', '91-106']... - TNoms
@CMor - 列名存在问题,更简单的解决方案是在我的解决方案之前通过 df.columns = range(len(df.columns)) 分配范围。 - jezrael
1
@jazrael 我明白了。现在它完美地工作了。非常感谢你的帮助! - TNoms

0

你可以使用 lambda 函数来拆分一个序列

import pandas as pd

df = pd.read_csv("data.csv")
df.head()

>>> data
0  12-24
1  13-26
2  14-28
3  15-30

df["d1"] = df["data"].apply(lambda x: x.split("-")[0])
df["d2"] = df["data"].apply(lambda x: x.split("-")[1])
df.head()

>>>
    data  d1  d2
0  12-24  12  24
1  13-26  13  26
2  14-28  14  28
3  15-30  15  30

0

对于输入:

df = pd.DataFrame({0: ['R1'], 1: ['Hawthorn'], 2: ['229-225'],  3: ['91-81'], 4:['210-142'], 5:['439-367'], 6:['7-12']})

    0         1        2      3        4        5     6
0  R1  Hawthorn  229-225  91-81  210-142  439-367  7-12

尝试代码:

for i in df.columns[2::]:
    df[[str(i)+'F', str(i)+'A']] =pd.DataFrame(df[i].str.split('-').tolist(), index= df.index)
    del df[i] 

打印(第一行):

    0         1   2F   2A  3F  3A   4F   4A   5F   5A 6F  6A
0  R1  Hawthorn  229  225  91  81  210  142  439  367  7  12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接