You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:20:34