我正在尝试使用三列的阈值来过滤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) 我有一个这样的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) 我有一个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 中有一个时间序列数据帧,每秒钟频率。我试图聚合数据以获得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
在每分钟将它的相关值设置为最大值。例如,假设最高Acceleration
为13:15
发生在13时15分10秒,这是1.2
米/秒^ 2。同一秒,速度为5
m/s。除了最大加速之外,我还想获得那个速度。谢谢。
我有一个具有以下架构的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) …
我有一个需要分解的格式如下的火花数据框。我检查了其他解决方案,例如这个。但是,就我而言,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) 我有一个nxm
numpy的阵列或者具有正值与像8个小数点0.02113342
或NoValue
数据即-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
从头开始而不是再次打开整个文件并替换它们?
我有一个带有列Longitude
和的pandas数据框Latitude
.我想X
和Y
他们相处.utm
调用from_latlon
中有一个函数可以执行此操作.它接收Latitude
和Longitude
并给出[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_XY
并from_latlon
只应用一次来节省时间.我看了一下这里,这里和这里,但我找不到用一个apply
函数制作两列的方法.谢谢.
python ×7
pandas ×5
time-series ×3
apache-spark ×2
aggregate ×1
aggregation ×1
apply ×1
ascii ×1
dataframe ×1
exec ×1
explode ×1
filter ×1
numpy ×1
pyspark ×1
resampling ×1
scala ×1
text ×1