我有一个带有混合类型列的pandas数据帧,我想将sklearn的min_max_scaler应用于某些列.理想情况下,我想在适当的位置进行这些转换,但还没有想出办法.我编写了以下代码:
import pandas as pd
import numpy as np
from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler()
dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],'B':[103.02,107.26,110.35,114.23,114.68], 'C':['big','small','big','small','small']})
min_max_scaler = preprocessing.MinMaxScaler()
def scaleColumns(df, cols_to_scale):
for col in cols_to_scale:
df[col] = pd.DataFrame(min_max_scaler.fit_transform(pd.DataFrame(dfTest[col])),columns=[col])
return df
dfTest
A B C
0 14.00 103.02 big
1 90.20 107.26 small
2 90.95 110.35 big
3 96.27 114.23 small
4 91.21 114.68 small
scaled_df = scaleColumns(dfTest,['A','B'])
scaled_df
A B C
0 0.000000 0.000000 big
1 0.926219 0.363636 small
2 0.935335 0.628645 big
3 1.000000 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试一次更新几个字段 - 我有两个数据源,我正在尝试协调它们.我知道我可以做一些丑陋的合并,然后删除列,但希望下面的代码工作:
df = pd.DataFrame([['A','B','C',np.nan,np.nan,np.nan],
['D','E','F',np.nan,np.nan,np.nan],[np.nan,np.nan,np.nan,'a','b','d'],
[np.nan,np.nan,np.nan,'d','e','f']], columns = ['Col1','Col2','Col3','col1_v2','col2_v2','col3_v2'])
print df
Col1 Col2 Col3 col1_v2 col2_v2 col3_v2
0 A B C NaN NaN NaN
1 D E F NaN NaN NaN
2 NaN NaN NaN a b d
3 NaN NaN NaN d e f
#update
df.loc[df['Col1'].isnull(),['Col1','Col2', 'Col3']] = df[['col1_v2','col2_v2','col3_v2']]
print df
Col1 Col2 Col3 col1_v2 col2_v2 col3_v2
0 A B C NaN NaN NaN
1 D E F NaN NaN NaN
2 NaN NaN NaN a b …
Run Code Online (Sandbox Code Playgroud) 我有一个动态创建的pandas数据框,其列名不同.我想他们推到SQL,但不希望他们去了MSSQLServer的默认数据类型"文本"(任何人都可以解释为什么这是默认?那岂不是有意义的使用更常见的数据类型? )
有谁知道如何为所有列指定数据类型?
column_errors.to_sql('load_errors',push_conn, if_exists = 'append', index = False, dtype = #Data type for all columns#)
Run Code Online (Sandbox Code Playgroud)
dtype参数采用dict,因为我不知道列是什么,所以很难将它们全部设置为'sqlalchemy.types.NVARCHAR'
这就是我想做的事情:
column_errors.to_sql('load_errors',push_conn, if_exists = 'append', index = False, dtype = 'sqlalchemy.types.NVARCHAR')
Run Code Online (Sandbox Code Playgroud)
任何帮助/理解如何最好地指定所有列类型将不胜感激!
我有一个pandas数据框,有两列,一个日期列和一个int列,我只想将int列(以天为单位)添加到日期列.我找到了一个使用df.apply()的解决方案,但这对我的完整数据集来说太慢了.我没有看到大量关于以矢量化方式进行此操作的文档(我能找到的最接近的是这个),所以我想确保我找到的解决方案是最好的方法.
我的原始数据只是一列字符串作为一列int(天).
import pandas as pd
from datetime import timedelta
df = pd.DataFrame([['2016-01-10',28],['2016-05-11',28],['2016-02-23',15],['2015-12-08',30]],
columns = ['ship_string','days_supply'])
print df
ship_string days_supply
0 2016-01-10 28
1 2016-05-11 28
2 2016-02-23 15
3 2015-12-08 30
Run Code Online (Sandbox Code Playgroud)
我的第一个想法(有效)是使用.apply如下:
def f(x):
return x['ship_date'] + timedelta(days=x['days_supply'] )
df['ship_date'] = pd.to_datetime(df['ship_string'])
df['supply_ended'] = df.apply(f,axis = 1)
Run Code Online (Sandbox Code Playgroud)
这很有效,但速度非常慢.我在下面发布了我的备用解决方案作为问题的答案,但我想确认它是"最佳实践".我没有找到很多关于将时间线列添加到熊猫日期中的好线程(特别是以矢量化的方式),所以我想添加一个更友好的用户,希望它能帮助下一个可怜的灵魂尝试做这个.
我正在使用我的树莓派来检测我的猫何时在桌子上,但我在一些图像捕获部分遇到了一些麻烦。这是我正在运行的相关代码:
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
import subprocess
#method 1
with PiCamera() as camera:
capImg = PiRGBArray(camera)
time.sleep(0.1)
camera.capture(capImg,format = 'bgr')
image = capImg.array
cv2.imwrite('image4.bmp',image)
#method 2
callString = 'raspistill -n -w %s -h %s -o /home/pi/python/catcam/image5.bmp --timeout 0' % (640,480)
subprocess.call(callString, shell = True)
Run Code Online (Sandbox Code Playgroud)
有没有办法将 raspistill 图像保留在内存中或执行类似camera.capture_continuous 的操作?比较 picamera 图像的质量:
使用 raspistill 后颜色更好:
我想每隔几秒钟捕获一张图像,但不想将每个图像写入磁盘,否则我会很快烧毁我的存储卡。而且,raspistill 速度相当慢。
任何有关如何以恒定速率捕获更好质量图像的指示将不胜感激!
编辑感谢下面的马克,我已经编辑了当前问题的帖子。
我有很多人的地址列表(每个地址1-8个地址),我正在尝试确定每个人拥有的唯一地址的数量.
这是一个人的示例地址数据集
#df[df['ID'] =='12345'][['address','zip]].values
addresses = [['PULMONARY MED ASSOC MED GROUP INC 1485 RIVER PARK DR STE 200',
'95815'],
['1485 RIVER PARK DRIVE SUITE 200', '95815'],
['1485 RIVER PARK DR SUITE 200', '95815'],
['3637 MISSION AVE SUITE 7', '95608']]
Run Code Online (Sandbox Code Playgroud)
我有一个地址解析器,分隔地址的不同部分,"attn",门牌号码,街道名称,邮政信箱等,以便我可以单独比较它们(这里的代码)
从上面的数据可以看出,地址1-3可能是相同的,地址4是不同的.
我写了下面的相似度计算方法 - 权重没有魔力,正如我的直觉所说的那样最重要
def calcDistance(a1, a2,z1,z2, parser):
z1 = str(z1)
z2 = str(z2)
add1 = parser.parse(a1)
add2 = parser.parse(a2)
zip_dist = 0 if z1 == z2 else distance.levenshtein(z1,z2)
zip_weight = .4
attn_dist = distance.levenshtein(add1['attn'],add2['attn']) if add1['attn'] and …
Run Code Online (Sandbox Code Playgroud) 我正在 pyspark 2.3 中工作,我正在尝试找出从数据框中获取一些聚合统计信息的最有效方法。
我有一个包含 15 亿条记录的数据框,分布在一个由 10 个节点组成的相对较小的集群中。每个都有 16GB 内存和 4 个核心。我的复制因子设置为 2。
我的数据框可能有 15 列,它们是数据类型的混合,但我只对两列感兴趣 - ID 和 eventDate。我想运行的代码非常简单:
output = df.groupby(['ID']).agg(F.min('eventDate').alias("firstDate"),F.max('eventDate').alias("lastDate"))
output.write.parquet('hdfs:///somewhere/dateFile.parquet',mode='overwrite')
Run Code Online (Sandbox Code Playgroud)
我试图找出执行此操作的最有效方法。ID(我要分组的字段)有 12m 个值,df.rdd.getNumPartitions() 目前为 642。
我最好先将数据框投影到我想要的两列吗?有这么多 ID,我应该先重新分区我的数据集吗?我应该删除重复项吗?我可以在我的 groupby 之前运行这样的事情:
df = df[['ID','eventDate']].drop_duplicates().repartition(x)
Run Code Online (Sandbox Code Playgroud)
或者
df = df[['ID','eventDate']].repartition(x)
Run Code Online (Sandbox Code Playgroud)
我正在努力找出什么可以优化运行时。任何有关预先确定运行时间的指导将不胜感激。如果可能的话,我不想只是“测试一下”,因为我有几个这样的查询要运行,每个查询都需要一段时间。
我有一些月度数据,我试图用Pandas总结,我需要计算每月发生的唯一条目数.这是一些示例代码,显示了我正在尝试做的事情:
import pandas as pd
mnths = ['JAN','FEB','MAR','APR']
custs = ['A','B','C',]
testFrame = pd.DataFrame(index=custs, columns=mnths)
testFrame['JAN']['A'] = 'purchased Prod'
testFrame['JAN']['B'] = 'No Data'
testFrame['JAN']['C'] = 'Purchased Competitor'
testFrame['FEB']['A'] = 'purchased Prod'
testFrame['FEB']['B'] = 'purchased Prod'
testFrame['FEB']['C'] = 'purchased Prod'
testFrame['MAR']['A'] = 'No Data'
testFrame['MAR']['B'] = 'No Data'
testFrame['MAR']['C'] = 'Purchased Competitor'
testFrame['APR']['A'] = 'Purchased Competitor'
testFrame['APR']['B'] = 'purchased Prod'
testFrame['APR']['C'] = 'Purchased Competitor'
uniqueValues = pd.Series(testFrame.values.ravel()).unique()
#CODE TO GET COUNT OF ENTRIES IN testFrame BY UNIQUE VALUE
Run Code Online (Sandbox Code Playgroud)
期望的输出:
JAN FEB …
Run Code Online (Sandbox Code Playgroud) 我不知道如何解释 sklearn(20.2 版)中半正弦实现的输出
文档说,“请注意,半正弦距离度量需要 [纬度,经度] 形式的数据,输入和输出都以弧度为单位。”,所以我应该能够转换为公里乘以 6371(远距离大约为半径)。
两点的功能距离计算如下:
def distance(origin, destination):
lat1, lon1 = origin
lat2, lon2 = destination
radius = 6371 # km
dlat = math.radians(lat2-lat1)
dlon = math.radians(lon2-lon1)
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
* math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = radius * c
return d
distance([32.027240,-81.093190],[41.981876,-87.969982])
1263.103504537151
Run Code Online (Sandbox Code Playgroud)
这是正确的距离。
使用 BallTree 实现:
from sklearn.neighbors import BallTree
test_points = [[32.027240,41.981876],[-81.093190,-87.969982]]
tree = BallTree(test_points,metric = 'haversine')
results = tree.query_radius(test_points,r = 10,return_distance …
Run Code Online (Sandbox Code Playgroud) 我有一个客户数据框,其中包含他们收到的货件记录.不幸的是,这些可能重叠.我正在尝试减少行数,以便我可以看到连续使用的日期.有没有什么方法可以做到这一点除了蛮力iterrows实施?
这是一个示例和我想做的事情:
df = pd.DataFrame([['A','2011-02-07','2011-02-22',1],['A','2011-02-14','2011-03-10',2],['A','2011-03-07','2011-03-15',3],['A','2011-03-18','2011-03-25',4]], columns = ['Cust','startDate','endDate','shipNo'])
df
Run Code Online (Sandbox Code Playgroud)
condensedDf = df.groupby(['Cust']).apply(reductionFunction)
condensedDF
Run Code Online (Sandbox Code Playgroud)
reductionFunction将前3个记录分组为一个,因为在每种情况下,下一个的开始日期都在前一个结束日期之前.我基本上把多个记录重叠成一条记录.
关于良好"pythonic"实施的想法?我可以在每个小组内做一个讨厌的循环,但我不想......
python ×9
pandas ×7
scikit-learn ×3
dataframe ×2
apache-spark ×1
haversine ×1
opencv ×1
pyspark ×1
raspberry-pi ×1
sqlalchemy ×1
timedelta ×1