簡體   English   中英

如何使用 Python 將 CSV 文件中的一行拆分為多行?

[英]How can I split a row in a CSV-file into multiple rows using Python?

我有一個只有一行的 CSV 文件,但有很多相同的列標題(不重復)。 我的最終目標是分析給定列的值,這取決於前一個同名列的值(不是與其相鄰的列)。

我的數據可能如下所示:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ***start block*** | stimulus | words.RT | words.ACC | ***end block***  | ***start block*** | stimulus | words.RT | words.ACC | ***end block***  |
+-------------------------------------------------------------------------------------------------------------------------------------------------+
|                   | pic1.png | 2300     | 1         |                  |                   | pic2.png | 2401     | 0         |                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


等等。

現在,我希望能夠根據前一個塊中 words.ACC 的值來分析例如 words.RT 的值。

我不確定最好的方法是什么。 我嘗試將 CSV 加載到 pandas-dataframe 中:

import pandas as pd 

file = "01.csv"
df = pd.read_csv(file, delimiter=";")
df.columns = df.columns.str.strip("\t")
df.columns = df.columns.str.strip(".34")
df = df.iloc[[0]] 

這基本上給了我一個看起來像我之前展示的數據表。 是否可以根據塊將行拆分為多行? 對我來說,看起來我需要一個三維數組來對塊進行編碼? pandas 甚至可能嗎?

你可以創建

df1 = df.iloc[ : , 0:4]
df2 = df.iloc[ : , 4:8]

和 append 他們

df = df1.append(df2)

import pandas as pd

data = {
    'A1': [1,2],
    'B1': [3,4],
    'C1': [5,6],
    'D1': [7,8],
    
    'A2': [1,2],
    'B2': [3,4],
    'C2': [5,6],
    'D2': [7,8],
}

df = pd.DataFrame(data)
print(df)

df1 = df.iloc[: , 0:4]
df1.columns = ['A', 'B', 'C', 'D']

df2 = df.iloc[: , 4:8]
df2.columns = ['A', 'B', 'C', 'D']

df = df1.append(df2)
df = df.reset_index(drop=True)

print(df)
 

如果你有更多的塊,那么你可以使用for -loop 和

df.iloc[ : , i:i+4]

import pandas as pd

data = {
    'A1': [1,2],
    'B1': [3,4],
    'C1': [5,6],
    'D1': [7,8],
    
    'A2': [1,2],
    'B2': [3,4],
    'C2': [5,6],
    'D2': [7,8],

    'A3': [1,2],
    'B4': [3,4],
    'C5': [5,6],
    'D6': [7,8],
}

df = pd.DataFrame(data)
print(df)

# get first block
new_df = df.iloc[:, 0:4]
new_df.columns = ['A', 'B', 'C', 'D']

# get other blocks
for i in range(4, len(df.columns), 4):
    temp_df = df.iloc[:, i:i+4]
    temp_df.columns = ['A', 'B', 'C', 'D']
    new_df = new_df.append( temp_df )

new_df = new_df.reset_index(drop=True)
print(new_df)
 

編輯:

相同,但變量block_size和 numbers 作為列名。

import pandas as pd

data = {
    'A1': [1,2],
    'B1': [3,4],
    'C1': [5,6],
    'D1': [7,8],
    
    'A2': [1,2],
    'B2': [3,4],
    'C2': [5,6],
    'D2': [7,8],

    'A3': [1,2],
    'B3': [3,4],
    'C3': [5,6],
    'D3': [7,8],

    'A4': [1,2],
    'B4': [3,4],
    'C4': [5,6],
    'D4': [7,8],    
}

df = pd.DataFrame(data)
print(df)

block_size = 4

# get first block
new_df = df.iloc[:, 0:block_size]

# set numbers for columns
new_df.columns = list(range(block_size))

# get other blocks
for i in range(block_size, len(df.columns), block_size):
    temp_df = df.iloc[:, i:i+block_size]

    # set the same numbers for columns
    temp_df.columns = list(range(block_size))
    
    new_df = new_df.append( temp_df )

# after loop reset rows numbers (indexes)
new_df = new_df.reset_index(drop=True)

print(new_df)
 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM