我有一个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个多边形,我想知道是否有更好的方法.感谢任何帮助!
我有以下列表:
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) 所以我有一个列表如下:
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)
但结果是,每个列表都被写成一行(而不是一列)
我正在尝试模糊匹配两个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) 我有一个像这样的数据框:
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) 我正在尝试编写一个导入文件的脚本,然后对该文件执行某些操作并将结果输出到另一个文件中.
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'>
我有一个这样的数据帧:
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 …
我正在尝试在熊猫中创建一个简单的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)
我知道我在这里犯了一个错误。
结果是每个单元格中的整个数据帧值。
任何帮助将非常感激!
我有一个这样的数据框:
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)
例如,回答类似的问题:在熊猫数据框中添加日期时间行并向前填充数据
但是我的数据框没有日期时间索引。
感谢任何帮助!
我有一个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行,因为我在数据帧中需要它们.
知道如何解决这个问题吗?
我有一个数据帧如下:
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) pandas ×10
python ×10
dataframe ×1
fuzzy-search ×1
fuzzywuzzy ×1
geopandas ×1
group-by ×1
if-statement ×1
list ×1
merge ×1
nested ×1
python-3.x ×1
sum ×1