小编HYR*_*YRY的帖子

如何在不知道NA值模式的情况下快速将列转换为数字

我有许多具有相同列标题的CSV文件要解析.在这些文件中,可能有几种模式来表示NA,例如:" - "," - ","/",......

我不知道所有的模式,所以我不能正确设置na_values参数read_csv().

有没有快速的方法来查找这些文件中的所有NA模式,或者不知道所有模式,我仍然可以将所有列转换为数字?这是我尝试过的:

patterns = set()
for i, fn in enumerate(glob(u"data/*.csv")):
    df = pd.read_csv(fn, encoding="utf-8-sig", usecols=cols, dtype=str, keep_default_na=False)
    df_num = df.convert_objects(convert_numeric=True)
    patterns.update( df[df_num.isnull()].stack().value_counts().index )
Run Code Online (Sandbox Code Playgroud)

但是convert_objects()很慢.这是一些测试:

  • read_csv(dtype=str):约2.2秒
  • read_csv()没有dtype争论:大约2.5s
  • read_csv(dtype=str)+ convert_objects():8.4s

因此,read_csv()可以非常快速地将字符串转换为数字convert_objects().但是如果有一个元素无法转换为数字,则整个列将成为字符串列.

有没有更快的方法可以将所有列转换为数字而不设置na_values参数?

csv pandas

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

如何在不使用编码的情况下为一组只绘制一个标记

import altair as alt
from vega_datasets import data
cars = data.cars()
Run Code Online (Sandbox Code Playgroud)
alt.Chart(cars).mark_point(opacity=0.1).encode(
    x="Cylinders:O",
    y="Origin"
)
Run Code Online (Sandbox Code Playgroud)

它在一个位置绘制多个点:

在此输入图像描述

要在一个地方只绘制一个点,我需要添加一个编码count()

alt.Chart(cars).mark_point(opacity=0.3).encode(
    x="Cylinders:O",
    y="Origin",
    tooltip="count()"
)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 或使用transform_aggregate(),但我需要设置 groupby 参数:

alt.Chart(cars).mark_point(opacity=0.4).encode(
    x="Cylinders:O",
    y="Origin",
).transform_aggregate(
    count="count()",
    groupby=["Cylinders", "Origin"]
)
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以在没有transform_aggregate()或 的情况下做到这一点count()

python altair

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

调用借为不可变的闭包时,无法在循环中借为可变变量吗?

这是代码:

fn test(){
    let mut numbers = vec![2];
    let f = || {
        for _ in numbers.iter(){
        }
        false
    };

    while false {
        let res = f();
        if res {
            numbers.push(10);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

错误是:

fn test(){
    let mut numbers = vec![2];
    let f = || {
        for _ in numbers.iter(){
        }
        false
    };

    while false {
        let res = f();
        if res {
            numbers.push(10);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将while关键字更改为if,则可以对其进行编译。如何解决这个问题?我想在循环中调用匿名函数。

closures rust borrow-checker

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

如何在Python中进行C语言计算

我想在Python中做一些C语言计算的模拟.例如,unsigned short,single precision float ...

ushort(0xffff) + 1 -> 0
0.1f * 0.1f -> ...
Run Code Online (Sandbox Code Playgroud)

是否有一些库在Python中执行此操作?

我可以使用ctypes来创建unsigned short,single float,但它们不能进行数学运算:

a = c_uint16(0xffff)
b = c_uint16(0x01)
a+b -> TypeError
Run Code Online (Sandbox Code Playgroud)

或者,我可以使用numpy:

>>> np.uint16(0xffff) + np.uint16(0x01)
Warning: overflow encountered in ushort_scalars
0
Run Code Online (Sandbox Code Playgroud)

但与Python的正常计算相比,这是非常缓慢的:

>>> timeit.timeit("a+b", "import numpy as np;a=np.uint16(0xfffe);b=np.uint16(0x01)")
0.35577465681618037
>>> timeit.timeit("0xfffe+0x01")
0.022638104432360251
>>> timeit.timeit("np.uint16(0xfffe) + np.uint16(0x01)", "import numpy as np")
5.904765399236851  
Run Code Online (Sandbox Code Playgroud)

编辑:

>>> timeit.timeit("a+b", "a=0xfffe;b=0x01")
0.040062221014295574  
Run Code Online (Sandbox Code Playgroud)

python ctypes numpy

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

如何在pandas框架中按月份时间汇总?

我在Pandas数据框中有下表:

名字诞生

jack 1989-11-17

joe  1988-09-10

ben  1980-10-20

kate 1985-05-15

nichos 1986-07-05

john  1989-11-12

tom   1980-10-25

jason 1985-05-21

eron  1985-07-10

yun   1989-11-05

kung  1986-07-01
Run Code Online (Sandbox Code Playgroud)

我想在出生月份做一些聚合,结果应该是这样的:

moth cnt

1989-11 3

1988-09 1

1986-07 2

1985-07 1

1985-05 2

1980-10 2
Run Code Online (Sandbox Code Playgroud)

这样做有什么方便吗?非常感谢

python aggregate pandas

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

标签 统计

python ×3

pandas ×2

aggregate ×1

altair ×1

borrow-checker ×1

closures ×1

csv ×1

ctypes ×1

numpy ×1

rust ×1