我有一个具有以下内容的Series对象:
date price
dec 12
may 15
apr 13
..
问题陈述: 我想按月显示它,并计算每个月的平均价格,然后按月以排序的方式显示它。
所需输出:
month mean_price
Jan XXX
Feb XXX
Mar XXX
我想到了制作列表并将其传递给sort函数的方法:
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
但是 sort_values 不支持序列化。
我有一个大问题是,即使
df = df.sort_values(by='date',ascending=True,inplace=True)
最初可以工作,df
但是在我做完之后groupby
,它并不能保持排序后的顺序df
。
总而言之,我需要从初始数据帧起这两列。对datetime列进行排序,并使用月份(dt.strftime(’%B’))通过分组进行排序。现在,我必须按月份名称对其进行排序。
我的代码:
df # has 5 columns though I need the column 'date' and 'price'
df.sort_values(by='date',inplace=True) #at this part it is sorted according to date, great
total=(df.groupby(df['date'].dt.strftime('%B'))['price'].mean()) # Though now it is not as it was but instead the months appear alphabetically
感谢@Brad Solomon提供了一种更快的大写字符串方式!
注意1 @Brad Solomon的答案使用pd.categorical
应该比我的答案节省更多资源。他展示了如何为您的分类数据分配顺序。你不应该错过它:P
或者,您可以使用。
df = pd.DataFrame([["dec", 12], ["jan", 40], ["mar", 11], ["aug", 21],
["aug", 11], ["jan", 11], ["jan", 1]],
columns=["Month", "Price"])
# Preprocessing: capitalize `jan`, `dec` to `Jan` and `Dec`
df["Month"] = df["Month"].str.capitalize()
# Now the dataset should look like
# Month Price
# -----------
# Dec XX
# Jan XX
# Apr XX
# make it a datetime so that we can sort it:
# use %b because the data use the abbriviation of month
df["Month"] = pd.to_datetime(df.Month, format='%b', errors='coerce').dt.month
df = df.sort_values(by="Month")
total = (df.groupby(df['Month"])['Price'].mean())
# total
Month
1 17.333333
3 11.000000
8 16.000000
12 12.000000
注意2 groupby
默认情况下会为您排序组密钥。请注意,在和中使用相同的键进行排序和分组df = df.sort_values(by=SAME_KEY)
,total = (df.groupby(df[SAME_KEY])['Price'].mean()).
否则,可能会发生意外行为。
注意3
一种更有效的计算方法是先计算均值,然后按月进行排序。这样,您只需要排序12个项目,而不是整个项目df
。如果不需要df
分类,它将减少计算成本。
注释4 对于已经拥有 month
as
index的人
,想知道如何使其分类,请看一下熊猫。CategoricalIndex
@jezrael有一个有效的示例,可按月索引对按熊猫系列排列的分类索引进行排序
问题内容: 我有一个熊猫数据框,如下所示: 我想按它排序,但该列只是一个。 我试图将列设置为日期对象,但是遇到了一种格式不需要的格式的问题。所需的格式为等。 因此,现在我试图找出如何使numpy将“美国”日期转换为ISO标准,以便可以使它们成为日期对象,以便可以对它们进行排序。 我该如何将这些美国日期转换为ISO标准,或者我在熊猫中缺少更直接的方法? 问题答案: 您可以用来转换为日期时间对象。它带
问题内容: 我想对以下数据框进行排序: 我想对它进行排序,以便根据列表对LSE列进行重新排序: 当然,其他列也需要相应地重新排序。有没有办法在熊猫里做到这一点? 问题答案: pandas0.15版中对s的改进支持使您可以轻松做到这一点: 如果这只是临时排序,则可能不希望将LSE列保留为a ,但是如果您希望这种排序能够在不同的上下文中使用几次,则是一个很好的解决方案。 在更高版本的,中,已被替换为,
问题内容: 我有两个具有以下列名称的数据框: 我想通过加入(左)on获得以下列的数据框: 如果我要连接的列不是索引,我无法弄清楚该怎么做。最简单的方法是什么?谢谢! 问题答案: 您可以按以下方式使用left_on和right_on选项: 从问题中我不能确定您是否只想合并密钥是否位于左侧数据框中。如果是这种情况,则以下将执行此操作(以上内容实际上会进行多对多合并)
问题内容: 我有一个简单的数据框,我想每3行进行装箱。 看起来像这样: 我想把它变成这样: 你能帮我吗? 非常感谢! 问题答案: 在Python 2中使用:
问题内容: 我引用的数据框如下(是列名): 但是我不想被硬编码,我想要一个变量来使其动态。怎么做? TIA 问题答案: 您可以使用方括号对列进行索引: 因此,当您接受输入为a时,您可以执行以下操作: 此外,将列作为属性访问可能导致模棱两可的行为。如具有列命名,并尝试做这可能要列不同的值,或者如果你有一个名为一样像任何有效的方法DF柱或那么这将导致语法错误。 因此,我强烈建议您使用方括号来选择列。
我有以下数据框: 我需要按年和月分组数据。即:按2013年1月、2013年2月、2013年3月等分组...我将使用新分组的数据来创建一个显示每年/每月abc vs xyz的图表。 我尝试过groupby和sum的各种组合,但似乎没有任何效果。 谢谢你的帮助。