如何将GeoDataFrame中的单个二进制列转换为十进制?
二进制列转十进制的GeoDataFrame处理问题
我有一个GeoDataFrame,已经新建了total列,这列是数据集某列值的求和结果,但输出是二进制格式,需要把整列转换成十进制。我试过用frombinaryToDecimal和int("total")方法,相关脚本如下:
import geopandas import pandas as pd pd.set_option('display.max_columns', None) df = geopandas.read_file("Traps_records_4th_April_Pulse.csv") df["total"] = "" trap_ids = df["trap nid"].unique() for trap in trap_ids: rows = df.loc[df['trap nid'] == trap] df.loc[df['trap nid'] == trap, 'total'] = rows["strikes"].sum() print(df) int_total = int("total") print(int_total) df.to_csv('modified.csv')
当前输出示例:
trap condition notes Images geometry total 0 OK None 100 1 OK None 110011 2 OK None 111 3 OK None 1101 4 OK None 10100 .. ... ... ... ... ... 771 OK None 1 772 OK None 10011001111 773 OK None 001 774 OK None 1100010 775 OK On ground None 0
解决方案
你的问题核心是两点:一是int("total")错误地将字符串"total"而非DataFrame列内容转成整数;二是未正确处理二进制字符串到十进制的转换逻辑。以下是修正方案:
1. 优化分组求和逻辑
原循环赋值效率低下,改用groupby+transform可直接完成分组求和并映射回原DataFrame:
df["total"] = df.groupby("trap nid")["strikes"].transform("sum")
2. 二进制转十进制
使用apply结合int函数(指定进制为2),先确保列值为字符串类型以处理前导零:
# 新增十进制列total_decimal df["total_decimal"] = df["total"].astype(str).apply(lambda x: int(x, 2))
完整修正代码
import geopandas import pandas as pd pd.set_option('display.max_columns', None) df = geopandas.read_file("Traps_records_4th_April_Pulse.csv") # 高效计算每个trap的strikes总和 df["total"] = df.groupby("trap nid")["strikes"].transform("sum") # 将二进制total列转为十进制 df["total_decimal"] = df["total"].astype(str).apply(lambda x: int(x, 2)) print(df) df.to_csv('modified.csv')
关键说明
int(x, 2)会自动处理带前导零的二进制字符串(比如"001"会转为十进制1);- 若
total列求和结果为数值类型(而非字符串),必须先转成字符串再执行转换,否则会把数值当成十进制处理(比如数值100会被保留为100,而非二进制对应的4)。
内容的提问来源于stack exchange,提问作者Kenya Ashcroft
相关产品推荐
相关产品推荐

