如何使用 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)
我有一个 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)