numpy的具有看起来他们可被用于同样的东西三个不同的函数---不同之处在于numpy.maximum可仅被用于逐元素,而numpy.max且numpy.amax可以在特定轴,或所有元件一起使用.为什么不仅仅是numpy.max?在性能方面是否有一些微妙之处?
(同样适用于minvs. aminvs. minimum)
我有一个像这样的DataFrame:
In [7]:
frame.head()
Out[7]:
Communications and Search Business General Lifestyle
0 0.745763 0.050847 0.118644 0.084746
0 0.333333 0.000000 0.583333 0.083333
0 0.617021 0.042553 0.297872 0.042553
0 0.435897 0.000000 0.410256 0.153846
0 0.358974 0.076923 0.410256 0.153846
Run Code Online (Sandbox Code Playgroud)
在这里,我想询问如何获取每行具有最大值的列名,所需的输出如下:
In [7]:
frame.head()
Out[7]:
Communications and Search Business General Lifestyle Max
0 0.745763 0.050847 0.118644 0.084746 Communications
0 0.333333 0.000000 0.583333 0.083333 Business
0 0.617021 0.042553 0.297872 0.042553 Communications
0 0.435897 0.000000 0.410256 0.153846 Communications
0 0.358974 0.076923 0.410256 0.153846 Business
Run Code Online (Sandbox Code Playgroud) 我最近转向Python 3.5并注意到新的矩阵乘法运算符(@)有时与numpy点运算符的行为不同.例如,对于3d数组:
import numpy as np
a = np.random.rand(8,13,13)
b = np.random.rand(8,13,13)
c = a @ b # Python 3.5+
d = np.dot(a, b)
Run Code Online (Sandbox Code Playgroud)
的@运算符返回形状的阵列:
c.shape
(8, 13, 13)
Run Code Online (Sandbox Code Playgroud)
而np.dot()函数返回:
d.shape
(8, 13, 8, 13)
Run Code Online (Sandbox Code Playgroud)
如何用numpy dot重现相同的结果?还有其他重大差异吗?
关于如何定义python轴以及它们是否引用DataFrame的行或列,我一直很困惑.请考虑以下代码:
>>> df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], columns=["col1", "col2", "col3", "col4"])
>>> df
col1 col2 col3 col4
0 1 1 1 1
1 2 2 2 2
2 3 3 3 3
Run Code Online (Sandbox Code Playgroud)
因此,如果我们打电话df.mean(axis=1),我们将获得跨行的平均值:
>>> df.mean(axis=1)
0 1
1 2
2 3
Run Code Online (Sandbox Code Playgroud)
但是,如果我们调用df.drop(name, axis=1),我们实际上会删除一列而不是一行:
>>> df.drop("col4", axis=1)
col1 col2 col3
0 1 1 1
1 2 2 2
2 3 3 3
Run Code Online (Sandbox Code Playgroud)
有人能帮助我理解pandas/numpy/scipy中"轴"的含义吗?
旁注,DataFrame.mean可能被定义错了.它在文档中说, …
我尝试将matlab代码转换为numpy,并发现numpy与std函数有不同的结果.
在matlab中
std([1,3,4,6])
ans = 2.0817
Run Code Online (Sandbox Code Playgroud)
在numpy
np.std([1,3,4,6])
1.8027756377319946
Run Code Online (Sandbox Code Playgroud)
这是正常的吗?我该怎么处理呢?
在pandas中,按行或按列对数据帧进行随机播放的简单有效方法是什么?即如何编写一个函数shuffle(df, n, axis=0),它接受一个数据帧,一些shuffle n和一个轴(axis=0是行,axis=1是列),并返回已经洗牌n次数的数据帧的副本.
编辑:关键是在不破坏数据帧的行/列标签的情况下执行此操作.如果你只是洗牌df.index,那就失去了所有的信息.我希望结果df与原始相同,除了行的顺序或列的顺序不同.
编辑2:我的问题不清楚.当我说洗牌行时,我的意思是每行独立洗牌.因此,如果您有两列,a并且b我希望每行都自行进行洗牌,那么如果您只是重新排序每一行,那么您之间a和之间的关联就不b一样了.就像是:
for 1...n:
for each col in df: shuffle column
return new_df
Run Code Online (Sandbox Code Playgroud)
但希望比天真循环更有效.这对我不起作用:
def shuffle(df, n, axis=0):
shuffled_df = df.copy()
for k in range(n):
shuffled_df.apply(np.random.shuffle(shuffled_df.values),axis=axis)
return shuffled_df
df = pandas.DataFrame({'A':range(10), 'B':range(10)})
shuffle(df, 5)
Run Code Online (Sandbox Code Playgroud) 以此为出发点:
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
Out[8]:
one two three
0 10 1.2 4.2
1 15 70 0.03
2 8 5 0
Run Code Online (Sandbox Code Playgroud)
我想if在熊猫中使用类似声明的东西.
if df['one'] >= df['two'] and df['one'] <= df['three']:
df['que'] = df['one']
Run Code Online (Sandbox Code Playgroud)
基本上,通过if语句检查每一行,创建新列.
文档说要使用,.all但没有例子......
我无法弄清楚如何跳过csv文件中的n行,但保留标题为1行.
我想要做的是迭代,但保持第一行的标题. skiprows使标题成为跳过行之后的第一行.这样做的最佳方式是什么?
data = pd.read_csv('test.csv', sep='|', header=0, skiprows=10, nrows=10)
Run Code Online (Sandbox Code Playgroud) 我有一个由基本数学函数(abs,cosh,sinh,exp,...)组合定义的函数.
我想知道它是否有所作为(速度)使用,例如,
numpy.abs()而不是abs()?
我有一个非常大的DataFrame,我想知道是否有短(一或两个班轮)方式来获取DataFrame中非NaN条目的数量.我不希望一次只做一列,因为我有接近1000列.
df1 = pd.DataFrame([(1,2,None),(None,4,None),(5,None,7),(5,None,None)],
columns=['a','b','d'], index = ['A', 'B','C','D'])
a b d
A 1 2 NaN
B NaN 4 NaN
C 5 NaN 7
D 5 NaN NaN
Run Code Online (Sandbox Code Playgroud)
输出:
a: 3
b: 2
d: 1
Run Code Online (Sandbox Code Playgroud) python ×10
numpy ×6
pandas ×6
dataframe ×4
max ×2
arrays ×1
count ×1
csv ×1
if-statement ×1
math ×1
matlab ×1
nan ×1
performance ×1
python-3.5 ×1