熊猫数据框

时间:2020-10-31 06:39:15

标签: python pandas dataframe split

我有一个包含许多列和行的数据框,除最左边的两列外,所有列中都有“ integer-integer”形式的数据。我想将所有这些列分为两列,每个整数都在其自己的单元格中,并删​​除破折号。

我尝试遵循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 个答案:

答案 0 :(得分:2)

您可以将DataFrame.set_indexDataFrame.stack一起用于Series,然后由Series.str.split拆分为新的2列,转换为整数,并由{{3}创建新的列名},按DataFrame.set_axis进行整形,按DataFrame.unstack对列进行排序,最后按DataFrame.sort_indexMultiIndex转换为列,将其变平:

#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

答案 1 :(得分: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

答案 2 :(得分: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