如何使用 Python 将 CSV-file 中的一行拆分为多行?

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

我有一个 CSV-file 只有一行,但有很多相同的列 headers(不重复)。我的最终目标是根据具有相同名称的前一列(不是与其相邻的列)的值来分析给定列的值。

我的数据可能是这样的:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ***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.RT 取决于前一个块中 words.ACC 的值。

我不确定最好的方法是什么。我尝试将 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]] 

这基本上给了我一个看起来像我之前展示过的数据表。是否可以根据块将行拆分为多行?对我来说,看起来我需要一个 three-dimensional 数组来对块进行编码? pandas 甚至可能吗?

您可以创建

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

并附加它们

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循环和

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 和数字作为列名。

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)