【发布时间】:2020-12-05 09:30:51
【问题描述】:
我有一个pandas data frame,有两列,“早上”和“晚上”,分别代表早上和晚上的压力测量值。列中的值为“高”、“中”或“低”。
morning evening
0 high high
1 high medium
2 high medium
3 high low
4 medium high
我想创建两个列表,“pressure_change”和“pressure_change_likelihood”。 “pressure_change”描述了早晚之间发生了何种类型的压力变化,例如“高-低”是从早上的高压到晚上的低压的变化。 'pressure_change_likelihood' 描述了给定类型的压力变化的频率,例如,如果压力在早上很高,它在晚上的一半时间 (0.50) 变为中等。
pressure_change = [['high-high', 'high-medium', 'high-low'],
['medium-high', 'medium-medium', 'medium-low'],
['low-high', 'low-medium', 'low-low']]
pressure_change_likelihood = [[0.25, 0.50, 0.25],
[0.33, 0.00, 0.67],
[0.00, 1.00, 0.00]]
我已经能够很好地创建“pressure_change”,但问题是“pressure_change_likelihood”。我想我会尝试使用pd.df.groupby() 作为起点,然后将输出转换为列表列表,但是生成的熊猫系列不包括从未发生的事件的 0.00 值,以及价值观与我需要的不同。
import pandas as pd
# Data
data = [['high', 'high'], ['high', 'medium'], ['high', 'medium'], ['high', 'low'], ['medium', 'high'], ['medium', 'low'], ['medium', 'low'],['low', 'medium']]
df = pd.DataFrame(data, columns = ['morning', 'evening'])
# pressure_change
unique_array= df.morning.unique()
pressure_change = []
for i in unique_array:
sub_list = []
for k in unique_array:
sub_list.append(i+'-'+k)
pressure_change.append(sub_list)
# pressure_change_likelihood
per = df.groupby(['morning', 'evening'])['evening'].size()
pressure_change_likelihood = per.groupby(level=0).apply(lambda x: round(x / float(x.sum()), 2))
print(pressure_change_likelihood)
morning evening
high high 0.25
low 0.25
medium 0.50
low medium 1.00
medium high 0.33
low 0.67
Name: evening, dtype: float64
感谢您的帮助!
【问题讨论】:
标签: python pandas data-science data-cleaning