Pandas Dataframe
ฉันมีดาต้าเฟรมที่มีคอลัมน์และแถวจำนวนหนึ่งในคอลัมน์ทั้งหมดยกเว้นสองคอลัมน์ซ้ายสุดมีข้อมูลในรูปแบบ "จำนวนเต็ม - จำนวนเต็ม" ฉันต้องการแบ่งคอลัมน์เหล่านี้ทั้งหมดออกเป็นสองคอลัมน์โดยแต่ละจำนวนเต็มในเซลล์ของตัวเองและลบเส้นประ
ฉันได้พยายามทำตามคำตอบในPandas Dataframe: แยกหลายคอลัมน์ออกเป็นสองคอลัมน์แต่ดูเหมือนว่าจะแยกตามองค์ประกอบเดียวในขณะที่ฉันต้องการแยกที่ "-"
ตัวอย่างเช่นสมมติว่าฉันมี dataframe ของรูปแบบ:
ฉันต้องการแยกคอลัมน์ที่มีข้อความ 2 ถึง 22 เพื่อให้เรียกว่า 2F, 2A, 3F, 3A, ... , 6A โดยข้อมูลในแถวแรกคือ R1, Hawthorn, 229, 225, 91, 81, ... , 12.
ขอบคุณสำหรับความช่วยเหลือใด ๆ
คำตอบ
คุณสามารถใช้DataFrame.set_indexกับDataFrame.stackสำหรับSeriesแล้วแยกออกใหม่ 2 คอลัมน์โดยSeries.str.splitแปลงเป็นจำนวนเต็มสร้างคอลัมน์ชื่อใหม่โดยการDataFrame.set_axisก่อร่างใหม่โดยDataFrame.unstackเรียงลำดับคอลัมน์DataFrame.sort_indexและแผ่สุดท้ายMultiIndexที่มีค่าดัชนีแปลงคอลัมน์โดย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
สำหรับการป้อนข้อมูล:
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]
ภาพพิมพ์ (แถวที่ 1):
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
คุณสามารถใช้ฟังก์ชันแลมบ์ดาสำหรับการแยกชุด
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