小编Kvo*_*the的帖子

geopandas指向多边形

我有一个GeoDataFrame的多边形(~30)和一个GeoDataFrame的点(~10k)

我想在我的GeoDataFrame中创建30个新的列(具有适当的多边形名称),如果该点存在于多边形中,则使用简单的布尔值True/False.

例如,多边形的GeoDataFrame是这样的:

id  geometry
foo POLYGON ((-0.18353,51.51022, -0.18421,51.50767, -0.18253,51.50744, -0.1794,51.50914))
bar POLYGON ((-0.17003,51.50739, -0.16904,51.50604, -0.16488,51.50615, -0.1613,51.5091))
Run Code Online (Sandbox Code Playgroud)

Points的GeoDataFrame是这样的:

counter     points
   1     ((-0.17987,51.50974))
   2     ((-0.16507,51.50925))
Run Code Online (Sandbox Code Playgroud)

预期产量:

counter          points        foo    bar
   1    ((-0.17987,51.50974))  False  False
   1    ((-0.16507,51.50925))  False  False
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式手动完成:

foo = df_poly.loc[df_poly.id=='foo']
df_points['foo'] = df_points['points'].map(lambda x: True if foo.contains(x).any()==True else False
Run Code Online (Sandbox Code Playgroud)

但鉴于我有30个多边形,我想知道是否有更好的方法.感谢任何帮助!

python point-in-polygon pandas geopandas

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

从列表中创建一个熊猫排列的数据框

我有以下列表:

aa = ['aa1', 'aa2', 'aa3', 'aa4', 'aa5']
bb = ['bb1', 'bb2', 'bb3', 'bb4', 'bb5']
cc = ['cc1', 'cc2', 'cc3', 'cc4', 'cc5']
Run Code Online (Sandbox Code Playgroud)

我想像这样创建一个熊猫数据框:

aa    bb    cc
aa1   bb1   cc1
aa2   bb1   cc1
aa3   bb1   cc1
aa4   bb1   cc1
aa5   bb1   cc1
aa1   bb2   cc1
aa1   bb3   cc1
aa1   bb4   cc1
aa1   bb5   cc1
aa1   bb1   cc2
aa1   bb1   cc3
aa1   bb1   cc4
aa1   bb1   cc5
Run Code Online (Sandbox Code Playgroud)

我不知道如何做到这一点。我看过例子: How to generate all permutations of a list in Python

我可以使用以下方法单独进行每个排列:

import itertools
itertools.permutations(['aa1','aa2','aa3','aa4','aa5']) …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas

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

从不等长的嵌套列表创建一个熊猫数据框

所以我有一个列表如下:

aa = ['aa1', 'aa2', 'aa3', 'aa4', 'aa5']
bb = ['bb1', 'bb2', 'bb3', 'bb4']
cc = ['cc1', 'cc2', 'cc3']
Run Code Online (Sandbox Code Playgroud)

然后将其创建为嵌套列表:

nest = [aa, bb, cc]
Run Code Online (Sandbox Code Playgroud)

我想创建一个数据框如下:

aa   bb   cc
aa1  bb1  cc1
aa2  bb2  cc2
aa3  bb3  cc3
aa4  bb4  nan
aa5  nan  nan
Run Code Online (Sandbox Code Playgroud)

我试过了:

pd.DataFrame(nest, columns=['aa', 'bb', cc'])
Run Code Online (Sandbox Code Playgroud)

但结果是,每个列表都被写成一行(而不是一列)

python nested list pandas

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

Python模糊匹配(FuzzyWuzzy) - 保持最佳匹配

我正在尝试模糊匹配两个csv文件,每个文件包含一列相似但不相同的名称.

我的代码到目前为止如下:

import pandas as pd
from pandas import DataFrame
from fuzzywuzzy import process
import csv

save_file = open('fuzzy_match_results.csv', 'w')
writer = csv.writer(save_file, lineterminator = '\n')

def parse_csv(path):

with open(path,'r') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        yield row


if __name__ == "__main__":
## Create lookup dictionary by parsing the products csv
data = {}
for row in parse_csv('names_1.csv'):
    data[row[0]] = row[0]

## For each row in the lookup compute the partial ratio
for row in parse_csv("names_2.csv"): …
Run Code Online (Sandbox Code Playgroud)

python fuzzy-search string-matching fuzzywuzzy

7
推荐指数
3
解决办法
1万
查看次数

熊猫 groupby() 变换() max() 带过滤器

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

id     date       value
 1  12/01/2016      5 
 1  25/02/2016      7 
 1  10/03/2017      13 
 2  02/04/2016      0 
 2  06/07/2016      1 
 2  12/03/2017      6 
Run Code Online (Sandbox Code Playgroud)

我正在创建一个名为'max_ever'每个唯一值的列'id'

我可以:df['max_ever']=df.groupby(['id'])['value'].transform(max)

这会给我:

id     date       value  max_ever
 1  12/01/2016      5       13
 1  25/02/2016      7       13
 1  10/03/2017      13      13
 2  02/04/2016      0       6
 2  06/07/2016      1       6
 2  12/03/2017      6       6
Run Code Online (Sandbox Code Playgroud)

但我想为每个唯一值添加'max_12_months'另一today()'id'

我可以使用过滤后的日期创建一个新的数据框并重复上述操作,但我想尝试在此数据框中进行过滤和转换。

最终的数据框如下所示:

id     date       value  max_ever  max_12_months
 1  12/01/2016      13      13          7
 1  25/05/2016      7       13          7 …
Run Code Online (Sandbox Code Playgroud)

python pandas

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

熊猫用部分通配符读取csv文件

我正在尝试编写一个导入文件的脚本,然后对该文件执行某些操作并将结果输出到另一个文件中.

df = pd.read_csv('somefile2018.csv')

上面的代码完全正常.但是,我想避免在代码中硬编码文件名.

该脚本将在包含script.py多个csv文件的文件夹(目录)中运行.

我尝试过以下方法:

somefile_path = glob.glob('somefile*.csv')

df = pd.read_csv(somefile_path)

但是我收到以下错误:

ValueError: Invalid file path or buffer object type: <class 'list'>

python pandas

5
推荐指数
2
解决办法
3185
查看次数

pandas与isin一起发挥作用

我有一个这样的数据帧:

aa        bb  cc
[a, x, y] a   1
[b, d, z] b   2
[c, e, f] s   3
np.nan    d   4
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个这样的新列:

aa        bb  cc dd
[a, x, y] a   1  True
[b, d, z] b   2  True
[c, e, f] s   3  False
np.nan    d   4  False
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案是:

def some_function(row):
    if row['bb].isin(row['aa'])==True:
        return True
    return False
df['dd'] = df.apply(lambda row: some_function(row), axis=1)
Run Code Online (Sandbox Code Playgroud)

但这会引发错误 ("'str' object has no attribute 'isin'", 'occurred at index 0')

我怀疑,因为我在检查时错过了一些东西isin.

基本上,我需要检查str值bb …

python pandas

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

Pandas If语句(等同于Excel)

我正在尝试在熊猫中创建一个简单的if语句。

Excel版本如下:

= IF(E2 =“ ABC”,C2,E2)

我被困在如何基于字符串或部分字符串分配它。

这就是我所拥有的。

df['New Value'] = df['E'].map(lambda x: df['C'] if x == 'ABC' else df['E']]
Run Code Online (Sandbox Code Playgroud)

我知道我在这里犯了一个错误。

结果是每个单元格中的整个数据帧值。

任何帮助将非常感激!

if-statement python-3.x pandas

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

熊猫创建新的日期行并向前填充列值

我有一个这样的数据框:

id     date       value
 1  12/01/2016      5 
 1  25/02/2016      7 
 1  10/03/2017      13 
 2  02/04/2016      0 
 2  06/07/2016      1 
 2  18/04/2017      6 
Run Code Online (Sandbox Code Playgroud)

对于每个ID,都有一个带有值的开始日期,每隔几个月就有一行带有日期和值的行。我想为每个ID创建一个时间序列。因此,我想在第二天(直到今天)插入新行,该值将从上一行向前填充。

因此,数据框变为:

id     date       value
 1  12/01/2016      5 
 1  13/01/2016      5 
 1  14/01/2016      5 
 1  15/01/2016      5
 ...
 1  20/04/2017      13 
 ...
 2  18/04/2017      6 
 2  19/04/2017      6 
 2  20/04/2017      6 
Run Code Online (Sandbox Code Playgroud)

例如,回答类似的问题:在熊猫数据框中添加日期时间行并向前填充数据

但是我的数据框没有日期时间索引。

感谢任何帮助!

python pandas

3
推荐指数
2
解决办法
2037
查看次数

带有混合dtypes的pandas条件逻辑

我有一个pandas数据帧如下:

foo bar
a   b
1   10
2   25
3   9
Run Code Online (Sandbox Code Playgroud)

我想添加一个新列,如下所示:

foo bar baz
a   b   0
1   10  1
2   25  1
3   9   1
Run Code Online (Sandbox Code Playgroud)

这是:如果row ['foo']或row ['bar]是数字,那么row ['baz'] = 1 else 0

到目前为止我所拥有的是:

def some_function(row):
   if row['foo']>=0 or row['bar']>=0:
      return 1
   return 0

df['baz'] = df.apply(lambda row: some_function(row), axis=1
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为dtype不是int.我不能删除non-int行,因为我在数据帧中需要它们.

知道如何解决这个问题吗?

python pandas

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

熊猫组合总和

我有一个数据帧如下:

ref, type, amount
001, foo, 10
001, foo, 5
001, bar, 50
001, bar, 5
001, test, 100
001, test, 90
002, foo, 20
002, foo, 35
002, bar, 75
002, bar, 80
002, test, 150
002, test, 110
Run Code Online (Sandbox Code Playgroud)

这就是我想要得到的:

ref, type, amount, foo, bar, test
001, foo, 10, 15, 55, 190
001, foo, 5, 15, 55, 190
001, bar, 50, 15, 55, 190
001, bar, 5, 15, 55, 190
001, test, 100, 15, 55, 190
001, test, 90, …
Run Code Online (Sandbox Code Playgroud)

python merge group-by sum pandas

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