我有一个非常大的数据文件,可以使用以下代码建模:
import pandas as pd
import numpy as np
import random
x = pd.DataFrame({'file_name': np.repeat(['csv_1', 'csv_2'], 32),
'side': np.tile(np.repeat(['n', 'f'], 16),2),
'ten_13':np.tile(np.repeat(['10', '13'], 8),4),
'rand_data': np.random.uniform(-1, 1, size=64)})
x = x.set_index(['file_name', 'side', 'ten_13'])
x.head()
我需要您的帮助,使用pandas的groupby()方法将名为web_col
的列添加到上述DataFrame x
。
web_col
列取决于列side
,ten_13
中值的组合,并且具有四个可能的序列值之一:
file_name
包含各种csv文件;在下面的代码中它只有两个文件。每个文件都具有相同的side
和ten_13
的确切值。
我使用numpy函数web_col
创建了此np.where()
列,但我想使用pandas' groupby()。 np.where()
代码如下:
ten_13 = x.index.get_level_values('ten_13')
side = x.index.get_level_values('side')
n_10 = ((ten_13 == '10') & (side == 'n')).reshape(-1,8)
n_13 = ((ten_13 == '13') & (side == 'n')).reshape(-1,8)
f_10 = ((ten_13 == '10') & (side == 'f')).reshape(-1,8)
f_13 = ((ten_13 == '13') & (side == 'f')).reshape(-1,8)
web_col = np.where(n_10, np.arange(1, 9, 1),
np.where(f_10, np.arange( 17, 25, 1),
np.where(n_13, np.arange(9, 17, 1),
np.where(f_13, np.arange(25,33, 1), np.arange(1, 9, 1)))))
x['web_col'] = web_col.reshape(64,1)
x.head()
答案 0 :(得分:-1)
你可以使用pandas.apply()
,但考虑到你只有4个条件,以下可能效率更高。
x.loc[(x['side'] == 'n') & (x['ten_13'] == '10'), 'web_col'] = '1:8'
... for each condition
如果您设置了适当的索引,这将更快。
x.set_index(['side', 'ten_13'], inplace=True)
x.sortlevel(inplace=True) # speeds up lookups
x.loc[('n', '10'), 'web_col'] = '1:8'
... for each condition
x.reset_index(inplace=True) # to restore original dataframe