我正在寻找一种熊猫的良好转换方法,使我能够从一个时间序列的测量值转变为一个按时间间隔计数的列表。
让我说我有:
x = list(range(count))
y = [random.gauss(1, 0.1) for _ in range(count)]
我可以将其转换为两侧的合并间隔:
df = pandas.DataFrame.from_dict({'x': x, 'y': y})
df['x'].update(pandas.cut(df['x'], 20))
df['y'].update(pandas.cut(df['y'], 20))
我知道我可以使用以下方法获取y
的值计数:
df['y'].value_counts()
但是我无法将“按唯一的y
值分组的x
上的运行value_counts,然后展开,然后将其返回”进行有效操作。
示例:
y = [1, 1, 2, 3, 4, 4]
x = [0, 1, 2, 3, 4, 5]
bin_count = 2
预期:
df: x y count
0-2 1 2
0-2 2 1
3-5 3 1
3-5 4 2
答案 0 :(得分:1)
我相信您需要SeriesGroupBy.value_counts
和reset_index
:
y = [1, 1, 2, 3, 4, 4]
x = [0, 1, 2, 3, 4, 5]
bin_count = 2
df = pd.DataFrame.from_dict({'x': x, 'y': y})
df['x'].update(pd.cut(df['x'], bin_count))
df1 = df.groupby('x')['y'].value_counts().reset_index(name='count')
print (df1)
x y count
0 (-0.005, 2.5] 1 2
1 (-0.005, 2.5] 2 1
2 (2.5, 5.0] 4 2
3 (2.5, 5.0] 3 1
对于y
中的列,请使用unstack
:
df1 = df.groupby('x')['y'].value_counts().unstack(fill_value=0)
print (df1)
y 1 2 3 4
x
(-0.005, 2.5] 2 1 0 0
(2.5, 5.0] 0 0 1 2
编辑:
如果需要唯一的容器值,请将参数labels=False
添加到cut
:
df['x'].update(pd.cut(df['x'], bin_count, labels=False))
df1 = df.groupby('x')['y'].value_counts().unstack(fill_value=0)
print (df1)
y 1 2 3 4
x
0 2 1 0 0
1 0 0 1 2