在 pandas 中为枢轴 table 创建其旁边每一列的副本
Create copies of each column next to it for a pivot table in pandas
Table 看起来像这样:
Sensors M001 M002
Time
01:28.2 0 0
01:40.2 1 1
01:52.2 0 1
02:04.2 1 0
我想创建一个 table,每列有 2 个新的空副本,看起来像:
Sensors M001 M001(on) M001(off) M002 M002(on) M002(off)
Time
01:28.2 0 - - 0 - -
01:40.2 1 - - 1 - -
01:52.2 0 - - 1 - -
02:04.2 1 - - 0 - -
IIUC 你可以使用 loc
for creating new columns and then sort columns names by sort_index
:
for col in df.columns:
df.loc[:, col + '(on)'] = np.nan
df.loc[:, col + '(off)'] = np.nan
print df.sort_index(1)
Sensors M001 M001(off) M001(on) M002 M002(off) M002(on)
Time
01:28.2 0 NaN NaN 0 NaN NaN
01:40.2 1 NaN NaN 1 NaN NaN
01:52.2 0 NaN NaN 1 NaN NaN
02:04.2 1 NaN NaN 0 NaN NaN
另一种选择是通过列表理解创建新的列名,然后将新的 DataFrame
和 concat
创建为原始的 df
:
print df
Sensors M001 M002 M003
Time
01:28.2 0 0 1
01:40.2 1 1 0
01:52.2 0 1 1
02:04.2 1 0 1
cols = ['{}{}'.format(x, y) for y in ['(on)','(off)'] for x in df.columns.tolist()]
df1 = pd.DataFrame(columns = cols, index= df.index)
print df1
M001(on) M002(on) M003(on) M001(off) M002(off) M003(off)
Time
01:28.2 NaN NaN NaN NaN NaN NaN
01:40.2 NaN NaN NaN NaN NaN NaN
01:52.2 NaN NaN NaN NaN NaN NaN
02:04.2 NaN NaN NaN NaN NaN NaN
df = pd.concat([df,df1], axis=1)
print df.sort_index(1)
Sensors M001 M001(off) M001(on) M002 M002(off) M002(on) M003 M003(off) \
Time
01:28.2 0 NaN NaN 0 NaN NaN 1 NaN
01:40.2 1 NaN NaN 1 NaN NaN 0 NaN
01:52.2 0 NaN NaN 1 NaN NaN 1 NaN
02:04.2 1 NaN NaN 0 NaN NaN 1 NaN
Sensors M003(on)
Time
01:28.2 NaN
01:40.2 NaN
01:52.2 NaN
02:04.2 NaN
Table 看起来像这样:
Sensors M001 M002
Time
01:28.2 0 0
01:40.2 1 1
01:52.2 0 1
02:04.2 1 0
我想创建一个 table,每列有 2 个新的空副本,看起来像:
Sensors M001 M001(on) M001(off) M002 M002(on) M002(off)
Time
01:28.2 0 - - 0 - -
01:40.2 1 - - 1 - -
01:52.2 0 - - 1 - -
02:04.2 1 - - 0 - -
IIUC 你可以使用 loc
for creating new columns and then sort columns names by sort_index
:
for col in df.columns:
df.loc[:, col + '(on)'] = np.nan
df.loc[:, col + '(off)'] = np.nan
print df.sort_index(1)
Sensors M001 M001(off) M001(on) M002 M002(off) M002(on)
Time
01:28.2 0 NaN NaN 0 NaN NaN
01:40.2 1 NaN NaN 1 NaN NaN
01:52.2 0 NaN NaN 1 NaN NaN
02:04.2 1 NaN NaN 0 NaN NaN
另一种选择是通过列表理解创建新的列名,然后将新的 DataFrame
和 concat
创建为原始的 df
:
print df
Sensors M001 M002 M003
Time
01:28.2 0 0 1
01:40.2 1 1 0
01:52.2 0 1 1
02:04.2 1 0 1
cols = ['{}{}'.format(x, y) for y in ['(on)','(off)'] for x in df.columns.tolist()]
df1 = pd.DataFrame(columns = cols, index= df.index)
print df1
M001(on) M002(on) M003(on) M001(off) M002(off) M003(off)
Time
01:28.2 NaN NaN NaN NaN NaN NaN
01:40.2 NaN NaN NaN NaN NaN NaN
01:52.2 NaN NaN NaN NaN NaN NaN
02:04.2 NaN NaN NaN NaN NaN NaN
df = pd.concat([df,df1], axis=1)
print df.sort_index(1)
Sensors M001 M001(off) M001(on) M002 M002(off) M002(on) M003 M003(off) \
Time
01:28.2 0 NaN NaN 0 NaN NaN 1 NaN
01:40.2 1 NaN NaN 1 NaN NaN 0 NaN
01:52.2 0 NaN NaN 1 NaN NaN 1 NaN
02:04.2 1 NaN NaN 0 NaN NaN 1 NaN
Sensors M003(on)
Time
01:28.2 NaN
01:40.2 NaN
01:52.2 NaN
02:04.2 NaN