小编aho*_*osh的帖子

动态过滤pandas数据帧

我正在尝试使用三列的阈值来过滤pandas数据帧

import pandas as pd
df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
                   "B" : [2, 5, 3, 2, 6],
                   "C" : [-5, 2, 1, 8, 2]})
df = df.loc[(df.A > 0) & (df.B > 2) & (df.C > -1)].reset_index(drop = True)

df
    A  B  C
0   2  5  2
1  10  3  1
2   3  6  2
Run Code Online (Sandbox Code Playgroud)

但是,我想在一个函数中执行此操作,其中列的名称及其阈值在字典中提供给我.这是我的第一次尝试,运作正常.基本上我将过滤器放在cond变量中并运行它:

df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
                   "B" : [2, 5, 3, 2, 6],
                   "C" : …
Run Code Online (Sandbox Code Playgroud)

python exec filter dataframe pandas

20
推荐指数
2
解决办法
5867
查看次数

熊猫:过去n天的平均值

我有一个这样的Pandas数据框:

test = pd.DataFrame({ 'Date' : ['2016-04-01','2016-04-01','2016-04-02',
                             '2016-04-02','2016-04-03','2016-04-04',
                             '2016-04-05','2016-04-06','2016-04-06'],
                      'User' : ['Mike','John','Mike','John','Mike','Mike',
                             'Mike','Mike','John'],
                      'Value' : [1,2,1,3,4.5,1,2,3,6]
                })
Run Code Online (Sandbox Code Playgroud)

如下所示,数据集不一定每天都有观察结果:

         Date  User  Value
0  2016-04-01  Mike    1.0
1  2016-04-01  John    2.0
2  2016-04-02  Mike    1.0
3  2016-04-02  John    3.0
4  2016-04-03  Mike    4.5
5  2016-04-04  Mike    1.0
6  2016-04-05  Mike    2.0
7  2016-04-06  Mike    3.0
8  2016-04-06  John    6.0
Run Code Online (Sandbox Code Playgroud)

我想添加一个新列,显示过去n天内每个用户的平均值(在这种情况下n = 2),如果至少有一天可用,否则它会nan有价值.例如,2016-04-06约翰得到一个nan因为他没有2016-04-05和的数据2016-04-04.所以结果将是这样的:

         Date  User  Value  Value_Average_Past_2_days
0  2016-04-01  Mike    1.0 …
Run Code Online (Sandbox Code Playgroud)

python time-series aggregation pandas

12
推荐指数
1
解决办法
6375
查看次数

选定行在Pandas数据框中的聚合

我有一个pandas排序的数据框(基于时间)是这样的:

from datetime import datetime
df = pd.DataFrame({ 'ActivityDateTime' : [datetime(2016,5,13,6,14),datetime(2016,5,13,6,16),
                                 datetime(2016,5,13,6,20),datetime(2016,5,13,6,27),datetime(2016,5,13,6,31),
                                 datetime(2016,5,13,6,32),
                                datetime(2016,5,13,17,34),datetime(2016,5,13,17,36),
                                 datetime(2016,5,13,17,38),datetime(2016,5,13,17,45),datetime(2016,5,13,17,47),
                                datetime(2016,5,16,13,3),datetime(2016,5,16,13,6),
                                 datetime(2016,5,16,13,10),datetime(2016,5,16,13,14),datetime(2016,5,16,13,16)],
              'Value1' : [0.0,2.0,3.0,4.0,0.0,0.0,0.0,7.0,8.0,4.0,0.0,0.0,3.0,9.0,1.0,0.0],
               'Value2' : [0.0,2.0,3.0,4.0,0.0,0.0,0.0,7.0,8.0,4.0,0.0,0.0,3.0,9.0,1.0,0.0]
        })
Run Code Online (Sandbox Code Playgroud)

结果是这样的:

ActivityDateTime    Value1  Value2
0   2016-05-13 06:14:00 0.0 0.0
1   2016-05-13 06:16:00 2.0 2.0
2   2016-05-13 06:20:00 3.0 3.0
3   2016-05-13 06:27:00 4.0 4.0
4   2016-05-13 06:31:00 0.0 0.0
5   2016-05-13 06:32:00 0.0 0.0
6   2016-05-13 17:34:00 0.0 0.0
7   2016-05-13 17:36:00 7.0 7.0
8   2016-05-13 17:38:00 8.0 8.0
9   2016-05-13 17:45:00 4.0 4.0 …
Run Code Online (Sandbox Code Playgroud)

python aggregate time-series pandas

5
推荐指数
1
解决办法
538
查看次数

从 Pandas 中的重采样获取索引

我在 Python 中有一个时间序列数据帧,每秒钟频率。我试图聚合数据以获得Speed每分钟的最大值。我正在使用此代码:

df = pd.DataFrame({ 'Speed' : [],
                  'Acceleration' : []
            })
rng = pd.date_range('1/1/2011', periods=72, freq='s')
df['Speed'] = np.random.randn(len(rng))
df['Acceleration'] = np.random.randn(len(rng))
df = df.set_index(rng)
df['Acceleration'].resample("1Min").max()
Run Code Online (Sandbox Code Playgroud)

但是,我有另一列Speed,我有兴趣Acceleration在每分钟将它的相关值设置为最大值。例如,假设最高Acceleration13:15发生在13时15分10秒,这是1.2米/秒^ 2。同一秒,速度为5m/s。除了最大加速之外,我还想获得那个速度。谢谢。

python time-series resampling pandas

4
推荐指数
1
解决办法
1279
查看次数

使用udf在PySpark数据框中将纪元转换为日期时间

我有一个具有以下架构的PySpark数据框:

root
 |-- epoch: double (nullable = true)
 |-- var1: double (nullable = true)
 |-- var2: double (nullable = true)
Run Code Online (Sandbox Code Playgroud)

历元以秒为单位,应转换为日期时间。为此,我定义了一个用户定义的函数(udf),如下所示:

from pyspark.sql.functions import udf    
import time
def epoch_to_datetime(x):
    return time.localtime(x)
    # return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(x))
    # return x * 0 + 1

epoch_to_datetime_udf = udf(epoch_to_datetime, DoubleType())
df.withColumn("datetime", epoch_to_datetime(df2.epoch)).show()
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

---> 21     return time.localtime(x)
    22     # return x * 0 + 1
    23 
    TypeError: a float is required
Run Code Online (Sandbox Code Playgroud)

如果我仅返回x + 1该函数,它将起作用。尝试float(x)or float(str(x))numpy.float(x)in time.localtime(x) …

python apache-spark apache-spark-sql pyspark

4
推荐指数
3
解决办法
6311
查看次数

分解多个长度不同的相同类型的柱子

我有一个需要分解的格式如下的火花数据框。我检查了其他解决方案,例如这个。但是,就我而言,before并且after可以是不同长度的数组。

root
 |-- id: string (nullable = true)
 |-- before: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- start_time: string (nullable = true)
 |    |    |-- end_time: string (nullable = true)
 |    |    |-- area: string (nullable = true)
 |-- after: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- start_time: string (nullable = true)
 |    |    |-- end_time: string (nullable = true) …
Run Code Online (Sandbox Code Playgroud)

scala explode apache-spark apache-spark-sql

2
推荐指数
1
解决办法
890
查看次数

从一个 numpy 数组在文本文件上写入浮点数和整数

我有一个nxmnumpy的阵列或者具有正值与像8个小数点0.02113342NoValue数据即-9999。我正在使用下面的行从 numpy 数组中创建一个文本文件

numpy.savetxt("result.asc", Numpy_Array, fmt="%.8f")#2D array to ASCII
Run Code Online (Sandbox Code Playgroud)

但是,我将-9999.00000000代替-9999. 我打开文件并-9999使用以下代码替换这些数字:

with file("result.asc", 'r') as original: 
    data = original.read()
    new = data.replace(str(-9999)+".00000000", str(-9999))
with file("result.asc", 'w') as modified:
    modified.write(new)
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的写入方式-9999而不是-9999.00000000从头开始而不是再次打开整个文件并替换它们?

python text ascii numpy

1
推荐指数
1
解决办法
1070
查看次数

将函数应用于两列pandas数据帧以获得两个新列

我有一个带有列Longitude和的pandas数据框Latitude.我想XY他们相处.utm调用from_latlon中有一个函数可以执行此操作.它接收LatitudeLongitude并给出[X,Y].这是我做的:

    def get_X(row):
        return utm.from_latlon(row['Latitude'], row['Longitude'])[0]

    def get_Y(row):
        return utm.from_latlon(row['Latitude'], row['Longitude'])[1] 

    df['X'] = df.apply(get_X, axis=1)
    df['Y'] = df.apply(get_Y, axis=1)
Run Code Online (Sandbox Code Playgroud)

我想定义一个函数get_XYfrom_latlon只应用一次来节省时间.我看了一下这里,这里这里,但我找不到用一个apply函数制作两列的方法.谢谢.

python apply multiple-columns pandas

0
推荐指数
1
解决办法
7761
查看次数