簡體   English   中英

使用 pandas 合並相同的列

[英]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.

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