我有一个包含许多列和行的数据框,除最左边的两列外,所有列中都有“ integer-integer”形式的数据。我想将所有这些列分为两列,每个整数都在其自己的单元格中,并删除破折号。
我尝试遵循Pandas Dataframe: Split multiple columns each into two columns中的答案,但似乎它们是在一个元素后面拆分,而我想在“-”上拆分。
通过示例,假设我有一个格式为以下数据框:
我想将标记为2到22的列拆分为2F,2A,3F,3A,...,6A,第一行中的数据为R1,Hawthorn,229、225、91 ,81,...,12。
谢谢您的帮助。
答案 0 :(得分:2)
您可以将DataFrame.set_index
与DataFrame.stack
一起用于Series
,然后由Series.str.split
拆分为新的2列,转换为整数,并由{{3}创建新的列名},按DataFrame.set_axis
进行整形,按DataFrame.unstack
对列进行排序,最后按DataFrame.sort_index
将MultiIndex
转换为列,将其变平:
#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