Python pandas:在没有日期变量的情况下按组区分数据帧中的所有时间序列
Python pandas: differentiating all time series in data frame by group without the date variable
我想在不区分日期的情况下通过分组变量区分 pandas 数据框中的所有列。这是一个可重现的例子:
test_df = pd.DataFrame(data = {
'date': pd.date_range(start = '2018-10-01', periods = 10),
'group': sum([np.repeat('a', 5).tolist(),
np.repeat('b', 5).tolist()], []),
'var1': [1, 3, 4, 6, 8, 10, 11, 14, 8, 10],
'var2': np.random.random(size=10)
})
代码:
test_df.groupby(['group']).diff()
不满足假设,因为它将 date
列与 var1
和 var2
区分开来。我想出了这样一个解决方案:
var_names = ['var1', 'var2']
test_df[[('diff.' + var + '.1') for var in var_names]] = (test_df
.groupby(['group'])[var_names].diff())
test_df
date group var1 var2 diff.var1.1 diff.var2.1
0 2018-10-01 a 1 0.237615 NaN NaN
1 2018-10-02 a 3 0.652502 2.0 0.414887
2 2018-10-03 a 4 0.676830 1.0 0.024328
3 2018-10-04 a 6 0.047120 2.0 -0.629710
4 2018-10-05 a 8 0.047494 2.0 0.000374
5 2018-10-06 b 10 0.447973 NaN NaN
6 2018-10-07 b 11 0.428788 1.0 -0.019185
7 2018-10-08 b 14 0.046168 3.0 -0.382620
8 2018-10-09 b 8 0.805820 -6.0 0.759651
9 2018-10-10 b 10 0.329497 2.0 -0.476323
有什么方法可以更轻松地做到这一点(使用更少的代码或更易读的代码)?
- 使用
pd.Index.difference
,您不必手动指定要比较的列,只需指定要排除的列。
- 使用
DataFrame.add_prefix
为每个列名称添加 diff.
前缀
- 使用
DataFrame.add_suffix
添加.1
后缀
- 最后,用
pd.concat
将它们连在一起
cols = test_df.columns.difference(['group', 'date']).tolist()
v = test_df.groupby('group')[cols].diff().add_prefix('diff.').add_suffix('.1')
df = pd.concat([test_df, v], axis=1)
df
date group var1 var2 diff.var1.1 diff.var2.1
0 2018-10-01 a 1 0.861522 NaN NaN
1 2018-10-02 a 3 0.677932 2.0 -0.183591
2 2018-10-03 a 4 0.232214 1.0 -0.445718
3 2018-10-04 a 6 0.148613 2.0 -0.083600
4 2018-10-05 a 8 0.119071 2.0 -0.029542
5 2018-10-06 b 10 0.279673 NaN NaN
6 2018-10-07 b 11 0.711369 1.0 0.431696
7 2018-10-08 b 14 0.396185 3.0 -0.315184
8 2018-10-09 b 8 0.515509 -6.0 0.119324
9 2018-10-10 b 10 0.319519 2.0 -0.195990
或者,为了更有效的解决方案,您可以使用 pd.Index.map
进行重命名步骤:
v = test_df.groupby('group')[cols].diff()
v.columns = v.columns.map(lambda x: 'diff.' + x + '.1')
主题变化:
cols = ['var1','var2']
new_cols = [f'diff.{thing}.1' for thing in cols]
gb = test_df.groupby('group')
test_df[new_cols] = gb[cols].diff()
我想在不区分日期的情况下通过分组变量区分 pandas 数据框中的所有列。这是一个可重现的例子:
test_df = pd.DataFrame(data = {
'date': pd.date_range(start = '2018-10-01', periods = 10),
'group': sum([np.repeat('a', 5).tolist(),
np.repeat('b', 5).tolist()], []),
'var1': [1, 3, 4, 6, 8, 10, 11, 14, 8, 10],
'var2': np.random.random(size=10)
})
代码:
test_df.groupby(['group']).diff()
不满足假设,因为它将 date
列与 var1
和 var2
区分开来。我想出了这样一个解决方案:
var_names = ['var1', 'var2']
test_df[[('diff.' + var + '.1') for var in var_names]] = (test_df
.groupby(['group'])[var_names].diff())
test_df
date group var1 var2 diff.var1.1 diff.var2.1
0 2018-10-01 a 1 0.237615 NaN NaN
1 2018-10-02 a 3 0.652502 2.0 0.414887
2 2018-10-03 a 4 0.676830 1.0 0.024328
3 2018-10-04 a 6 0.047120 2.0 -0.629710
4 2018-10-05 a 8 0.047494 2.0 0.000374
5 2018-10-06 b 10 0.447973 NaN NaN
6 2018-10-07 b 11 0.428788 1.0 -0.019185
7 2018-10-08 b 14 0.046168 3.0 -0.382620
8 2018-10-09 b 8 0.805820 -6.0 0.759651
9 2018-10-10 b 10 0.329497 2.0 -0.476323
有什么方法可以更轻松地做到这一点(使用更少的代码或更易读的代码)?
- 使用
pd.Index.difference
,您不必手动指定要比较的列,只需指定要排除的列。 - 使用
DataFrame.add_prefix
为每个列名称添加 - 使用
DataFrame.add_suffix
添加.1
后缀 - 最后,用
pd.concat
将它们连在一起
diff.
前缀
cols = test_df.columns.difference(['group', 'date']).tolist()
v = test_df.groupby('group')[cols].diff().add_prefix('diff.').add_suffix('.1')
df = pd.concat([test_df, v], axis=1)
df
date group var1 var2 diff.var1.1 diff.var2.1
0 2018-10-01 a 1 0.861522 NaN NaN
1 2018-10-02 a 3 0.677932 2.0 -0.183591
2 2018-10-03 a 4 0.232214 1.0 -0.445718
3 2018-10-04 a 6 0.148613 2.0 -0.083600
4 2018-10-05 a 8 0.119071 2.0 -0.029542
5 2018-10-06 b 10 0.279673 NaN NaN
6 2018-10-07 b 11 0.711369 1.0 0.431696
7 2018-10-08 b 14 0.396185 3.0 -0.315184
8 2018-10-09 b 8 0.515509 -6.0 0.119324
9 2018-10-10 b 10 0.319519 2.0 -0.195990
或者,为了更有效的解决方案,您可以使用 pd.Index.map
进行重命名步骤:
v = test_df.groupby('group')[cols].diff()
v.columns = v.columns.map(lambda x: 'diff.' + x + '.1')
主题变化:
cols = ['var1','var2']
new_cols = [f'diff.{thing}.1' for thing in cols]
gb = test_df.groupby('group')
test_df[new_cols] = gb[cols].diff()