2015-11-06 20 views
7

Tôi có tệp csv có một số cột mà tôi đã phân tách bằng dấu hai chấm (;). Tuy nhiên, ONE cột được giới hạn bởi một đường ống | và tôi muốn phân định cột này và tạo cột mới.Phân tách một cột cụ thể và thêm chúng dưới dạng cột trong CSV (Python3, CSV)

Input:

Column 1 Column 2  Column 3 
    1   2   3|4|5 
    6   7   6|7|8 
    10   11   12|13|14 

mong muốn Output:

Column 1 Column 2  ID Age Height 
    1   2   3  4 5 
    6   7   6  7 8 
    10   11   12  13 14 

Mã của tôi cho đến nay delimits lần đầu tiên bởi; và sau đó chuyển đổi để DF (đó là định dạng cuối cùng mong muốn của tôi)

delimit = list(csv.reader(open('test.csv', 'rt'), delimiter=';')) 
df = pd.DataFrame(delimit) 
+1

bạn có thể phân tích cột cuối cùng và [chia nó] (http://stackoverflow.com/questions/14745022/pandas-dataframe-how-do- i-split-a-column-into-two) –

Trả lời

3

Bạn không hiển thị chính xác những gì các dữ liệu trông giống như (bạn nói nó được phân cách bằng dấu chấm phẩy, nhưng các ví dụ của bạn không có bất kỳ dấu chấm phẩy nào, nhưng nếu nó giống như là

Column 1;Column 2;Column 3 
1;2;3|4|5 
6;7;6|7|8 
10;11;12|13|14 

Bạn có thể làm điều gì đó ng như

>>> df = pd.read_csv("test.csv", sep="[;|]", engine='python', skiprows=1, 
        names=["Column 1", "Column 2", "ID", "Age", "Height"]) 
>>> df 
    Column 1 Column 2 ID Age Height 
0   1   2 3 4  5 
1   6   7 6 7  8 
2  10  11 12 13  14 

này hoạt động bằng cách sử dụng một ý nghĩa tách regex "hoặc ; hoặc |" và buộc các tên cột bằng tay.

Ngoài ra, bạn có thể làm điều đó trong một vài bước sau:

>>> df = pd.read_csv("test.csv", sep=";") 
>>> df 
    Column 1 Column 2 Column 3 
0   1   2  3|4|5 
1   6   7  6|7|8 
2  10  11 12|13|14 
>>> c3 = df.pop("Column 3").str.split("|", expand=True) 
>>> c3.columns = ["ID", "Age", "Height"] 
>>> df.join(c3) 
    Column 1 Column 2 ID Age Height 
0   1   2 3 4  5 
1   6   7 6 7  8 
2  10  11 12 13  14 
+0

Tôi nhận được lỗi sau khi cố gắng chạy nửa sau của mã của bạn: TypeError: split() có một đối số từ khoá không mong muốn 'expand' – user3682157

+1

@ user3682157: có thể bạn đang sử dụng phiên bản cũ hơn của gấu trúc. – DSM

0
delimit = list(csv.reader(open('test.csv', 'rt'), delimiter=';')) 

for row in delimit: 
    piped = row.pop() 
    row.extend(piped.split('|')) 

df = pd.DataFrame(delimit) 

delimit kết thúc lên trông như:

[ 
    ['1', '2', '3', '4', '5'], 
    ['6', '7', '6', '7', '8'], 
    ['10', '11', '12', '13', '14'], 
] 
0

Nó thực sự là nhanh hơn nhiều để sử dụng lib csv và str.replace:

import csv 
with open("test.txt") as f: 
    next(f) 
    # itertools.imap python2 
    df = pd.DataFrame.from_records(csv.reader(map(lambda x: x.rstrip().replace("|", ";"), f), delimiter=";"), 
            columns=["Column 1", "Column 2", "ID", "Age", "Height"]).astype(int) 

Một số timings:

In [35]: %%timeit 
pd.read_csv("test.txt", sep="[;|]", engine='python', skiprows=1, 
        names=["Column 1", "Column 2", "ID", "Age", "Height"]) 
    ....: 
100 loops, best of 3: 14.7 ms per loop 

In [36]: %%timeit                
with open("test.txt") as f: 
    next(f) 
    df = pd.DataFrame.from_records(csv.reader(map(lambda x: x.rstrip().replace("|", ";"), f),delimiter=";"), 
           columns=["Column 1", "Column 2", "ID", "Age", "Height"]).astype(int) 
    ....: 
100 loops, best of 3: 6.05 ms per loop 

Bạn chỉ có thể str.split:

with open("test.txt") as f: 
    next(f) 
    df = pd.DataFrame.from_records(map(lambda x: x.rstrip().replace("|", ";").split(";"), f), 
            columns=["Column 1", "Column 2", "ID", "Age", "Height"]) 
0

đặn ra một giải pháp cho bản thân mình:

df = pd.DataFrame(delimit) 
s = df['Column 3'].apply(lambda x: pd.Series(x.split('|'))) 
frame = pd.DataFrame(s) 
frame.rename(columns={0: 'ID',1:'Height',2:'Age'}, inplace=True) 
result = pd.concat([df, frame], axis=1) 
Các vấn đề liên quan