Pandas Dataframe

Oct 31 2020

ฉันมีดาต้าเฟรมที่มีคอลัมน์และแถวจำนวนหนึ่งในคอลัมน์ทั้งหมดยกเว้นสองคอลัมน์ซ้ายสุดมีข้อมูลในรูปแบบ "จำนวนเต็ม - จำนวนเต็ม" ฉันต้องการแบ่งคอลัมน์เหล่านี้ทั้งหมดออกเป็นสองคอลัมน์โดยแต่ละจำนวนเต็มในเซลล์ของตัวเองและลบเส้นประ

ฉันได้พยายามทำตามคำตอบในPandas Dataframe: แยกหลายคอลัมน์ออกเป็นสองคอลัมน์แต่ดูเหมือนว่าจะแยกตามองค์ประกอบเดียวในขณะที่ฉันต้องการแยกที่ "-"

ตัวอย่างเช่นสมมติว่าฉันมี dataframe ของรูปแบบ:

ฉันต้องการแยกคอลัมน์ที่มีข้อความ 2 ถึง 22 เพื่อให้เรียกว่า 2F, 2A, 3F, 3A, ... , 6A โดยข้อมูลในแถวแรกคือ R1, Hawthorn, 229, 225, 91, 81, ... , 12.

ขอบคุณสำหรับความช่วยเหลือใด ๆ

คำตอบ

2 jezrael Oct 31 2020 at 13:48

คุณสามารถใช้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
sharathnatraj Oct 31 2020 at 14:19

สำหรับการป้อนข้อมูล:

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
CodePerfectPlus Oct 31 2020 at 14:46

คุณสามารถใช้ฟังก์ชันแลมบ์ดาสำหรับการแยกชุด

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