【问题标题】:How can I create and use new function in DataFrame?如何在 DataFrame 中创建和使用新函数?
【发布时间】:2020-02-16 23:00:53
【问题描述】:

如何在我的 DataFrame 中创建新函数并使用这个新函数,以便在聚合期间添加新列? 从我的 DataFrame 中,我获取了“风向”和“温度”,对于这些列,我想汇总它并创建具有“风向”平均值的表,以及所有城市的值之间的差异,平均值为“aa”,对于“温度”。不过,在我使用函数“aa”的列中,我有 0。问题出在哪里,你能给我写适当的代码行吗?

def aa(x):
    return x - np.mean(x)

file.groupby(["City"]).agg({"Wind direction":[np.mean, aa], "Temperature":["mean", aa]})

【问题讨论】:

  • 您的aa 函数不是聚合。
  • 你需要的是 pandas .apply() 方法。如果您添加更多代码,以及一些显示您在 df 中开始的数据和所需输出的文本行,我们可以为您提供帮助。
  • 我想创建方法“aa”并在我的 .agg() 方法中使用它,这个“aa”方法应该显示某个城市的“温度”减去平均温度的方程结果城市。我使用这种列:file.columns = [“Station_ID”、“城市”、“日期”、“时间”、“温度”、“风速”、“风向”、“湿度”、“总降雨量” , "压力"]
  • edit您的问题添加相关信息。我并不完全清楚您想要实现什么,但根据您的描述,我很确定 agg 不是在这里使用的正确方法。正如@RightmireM 所说,您应该更好地解释您想要什么。请提供示例输入和所需输出的示例。

标签: python pandas function dataframe aggregates


【解决方案1】:

您在错误的分组级别应用aa。这是一个简单的例子:

np.random.seed(1)
size = 10
file = pd.DataFrame({
    'City': np.random.choice(list(string.ascii_uppercase), size),
    'Wind direction': np.random.randint(0, 360, size),
    'Temperature': np.random.randint(1, 100, size)
}).sort_values('City').reset_index(drop=True)

df:

  City  Wind direction  Temperature
0    A             252           87
1    F             129           30
2    F             254           95
3    I             281           69
4    J             178           88
5    L              71           15
6    L             276           88
7    M             237           51
8    P             357           97
9    Q             156           14

您的原始代码...

def aa(x):
    return x - np.mean(x)

file.groupby(["City"]).agg({"Wind direction":[np.mean, aa], "Temperature":["mean", aa]})

.. 产生:

     Wind direction                  Temperature               
               mean               aa        mean             aa
City                                                           
A             252.0                0        87.0              0
F             191.5    [-62.5, 62.5]        62.5  [-32.5, 32.5]
I             281.0                0        69.0              0
J             178.0                0        88.0              0
L             173.5  [-102.5, 102.5]        51.5  [-36.5, 36.5]
M             237.0                0        51.0              0
P             357.0                0        97.0              0
Q             156.0                0        14.0              0

注意只有那些出现两次的城市在结果表中有值吗?当您只有 1 个城市数据点时,x == np.mean(x) 所以它们的差值为 0。


解决方案

将您的聚合函数定义为:

def aa(col):
    # Difference between the local (city) mean and the global (entire column) mean
    return col.mean() - file[col.name].mean()

file.groupby(["City"]).agg({"Wind direction":[np.mean, aa], "Temperature":["mean", aa]}) 

结果:

     Wind direction        Temperature      
               mean     aa        mean    aa
City                                        
A             252.0   32.9        87.0  23.6
F             191.5  -27.6        62.5  -0.9
I             281.0   61.9        69.0   5.6
J             178.0  -41.1        88.0  24.6
L             173.5  -45.6        51.5 -11.9
M             237.0   17.9        51.0 -12.4
P             357.0  137.9        97.0  33.6
Q             156.0  -63.1        14.0 -49.4

【讨论】:

  • 在您的解决方案中的方法“aa”中有一行:return col.mean() - file[col.name].mean() 它提供了“col”的均值减去均值的解整列“col”,但每个城市只有一个温度,所以我们不需要每个城市的平均温度,所以正确写法是:return col - file[col.name].mean() ?
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 2021-02-11
  • 2019-11-29
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
相关资源
最近更新 更多