[英]Merging columns with same same using pandas
我在 CSV 文件中有以下數據:
time conc time conc time conc time conc
1:00 10 5:00 11 9:00 55 13:00 1
2:00 13 6:00 8 10:00 6 14:00 4
3:00 9 7:00 7 11:00 8 15:00 3
4:00 8 8:00 1 12:00 11 16:00 8
我只是想將它們合並為:
time conc
1:00 10
2:00 13
3:00 9
4:00 8
...
16:00 8
我有超過 1000 列,但我是 pandas 的新手。 所以只是想知道我怎樣才能實現?
一種方法是將 dataframe 切割成兩列切片,然后在重命名后使用 pd.concat() 重新組合。 首先正常加載dataframe:
df = pd.read_csv('time_conc.csv')
df
看起來像下面這樣。 請注意 pd.read_csv() 為重復的列名稱添加了后綴:
time conc time.1 conc.1 time.2 conc.2 time.3 conc.3
0 1:00 10 5:00 11 9:00 55 13:00 1
1 2:00 13 6:00 8 10:00 6 14:00 4
2 3:00 9 7:00 7 11:00 8 15:00 3
3 4:00 8 8:00 1 12:00 11 16:00 8
然后使用 pd.DataFrame.iloc 切片:
total_columns = len(df.columns)
columns_per_set = 2
column_sets = [df.iloc[:,set_start:set_start + columns_per_set].copy() for set_start in range(0, total_columns, columns_per_set)]
column_sets
現在是一個列表,將每對重復列作為單獨的 dataframe 保存。 接下來,遍歷列表以將列重命名為原始列:
for s in column_sets:
s.columns = ['time', 'conc']
這會修改每個兩列 dataframe 以使它們的列名匹配。 最后,使用 pd.concat() 通過匹配列軸來組合它們:
new_df = pd.concat(column_sets, axis=0, sort=False)
new_df
這為您提供了完整的兩列:
time conc
0 1:00 10
1 2:00 13
2 3:00 9
3 4:00 8
0 5:00 11
1 6:00 8
2 7:00 7
3 8:00 1
0 9:00 55
1 10:00 6
2 11:00 8
3 12:00 11
0 13:00 1
1 14:00 4
2 15:00 3
3 16:00 8
由於您的文件具有重復的列名,因此 Pandas 將添加后綴。 DataFrame header 默認為 ['time', 'conc', 'time.1', 'conc.1', 'time.2', 'conc.2', 'time.3', 'conc. 3'...]
假設您的 CSV 文件的分隔符是逗號:
import pandas as pd
df = pd.read_csv('/path/to/your/file.csv', sep=',')
total_n = len(df.columns)
lst = []
for x in range(int(total_n / 2 )):
if x == 0:
cols = ['time', 'conc']
else:
cols = ['time'+'.'+str(x), 'conc'+'.'+str(x)]
df_sub = df[cols] #Slice two columns each time
df_sub.columns = ['time', 'conc'] #Slices should have the same column names
lst.append(df_sub)
df = pd.concat(lst) #Concatenate all the objects
假設df
是 DataFrame 和 csv 文件數據,您可以嘗試以下操作:
# rename columns if needed
df.columns = ["time", "conc"]*(df.shape[1]//2)
# concatenate pairs of adjacent columns
pd.concat([df.iloc[:, [i, i+1]] for i in range(0, df.shape[1], 2)])
它給:
time conc
0 1:00 10
1 2:00 13
2 3:00 9
3 4:00 8
0 5:00 11
.. ... ..
3 12:00 11
0 13:00 1
1 14:00 4
2 15:00 3
3 16:00 8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.