我有许多具有相同列标题的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.5sread_csv(dtype=str)
+ convert_objects()
:8.4s因此,read_csv()
可以非常快速地将字符串转换为数字convert_objects()
.但是如果有一个元素无法转换为数字,则整个列将成为字符串列.
有没有更快的方法可以将所有列转换为数字而不设置na_values
参数?
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()
。
这是代码:
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
,则可以对其进行编译。如何解决这个问题?我想在循环中调用匿名函数。
我想在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) 我在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)
这样做有什么方便吗?非常感谢