Pandas系列 - 如何以嵌套方式使用函数?

时间:2018-04-24 11:28:26

标签: python pandas

当我尝试在pandas系列上使用简单乘法时,我得到索引结果的索引如下:

pd.Series([1, 2, 3]) * pd.Series([4, 5, 6])
>>> 0    4
    1    10
    2    18

我想以“嵌套”方式执行此操作,如下所示:

>>> 0    4
    1    5
    2    6
    3    8
    4    10
    5    12
    6    12
    7    15
    8    18

有没有办法以numpy或pandas的方式做到这一点?或者我需要使用for循环吗?如果我在大数据集中使用for循环,则该过程需要很长时间。

另外,我如何将这种方法用于不同的功能呢?谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

multiply.outer使用numpy.ravel

a = pd.Series([1, 2, 3])
b = pd.Series([4, 5, 6])

c = pd.Series(np.multiply.outer(a, b).ravel())

或者numpy.repeat使用numpy.tile

c = pd.Series(a.repeat(len(b)).values * np.tile(b, len(a)))
print (c)
0     4
1     5
2     6
3     8
4    10
5    12
6    12
7    15
8    18
dtype: int64

编辑:

感谢您shivsn建议使用numpy.outer

c = pd.Series(np.outer(a, b).ravel())

<强>计时

np.random.seed(2018)

N = 10000
a = pd.Series(np.random.randint(1000, size=N))
b = pd.Series(np.random.randint(1000, size=N))

In [81]: %timeit pd.Series(np.outer(a, b).ravel())
1 loop, best of 3: 174 ms per loop

In [82]: %timeit pd.Series(np.multiply.outer(a, b).ravel())
10 loops, best of 3: 174 ms per loop

In [83]: %timeit pd.Series(a.repeat(len(b)).values * np.tile(b, len(a)))
1 loop, best of 3: 1.2 s per loop

In [84]: %%timeit
    ...: index = pd.MultiIndex.from_product([a , b], names = ["a", "b"])
    ...: df = pd.DataFrame(index = index).reset_index()
    ...: df['a'] * df['b']
    ...: 
1 loop, best of 3: 3.01 s per loop

答案 1 :(得分:1)

您可以使用pd.MultiIndex.from_product方法。

In[1]:
a = [1, 2, 3]
b = [4, 5, 6]

index = pd.MultiIndex.from_product([a , b], names = ["a", "b"])
df = pd.DataFrame(index = index).reset_index()
dataf = pd.DataFrame({"Result" : df['a'] * df['b']})

输出

Out[1]:
      Result
0       4
1       5
2       6
3       8
4      10
5      12
6      12
7      15
8      18

答案 2 :(得分:1)

一种有效的方法是使用import React from "react"; import { render } from "react-dom"; import Hello from "./Hello"; class App extends React.Component { state = { articles: [] }; componentDidMount() { fetch("https://hacker-news.firebaseio.com/v0/jobstories.json?print=pretty") .then(res => res.json()) .then(articles => { articles.map(item => { fetch(`https://hacker-news.firebaseio.com/v0/item/${item}.json?print=pretty`) .then(res => res.json()) .then(detailArticles => { const articles = this.state.articles.concat(detailArticles); this.setState({ articles }); }); }); }); } render() { return <p>{JSON.stringify(this.state.articles) }</p>; } } render(<App />, document.getElementById("root"));

numpy

结果:

a = pd.Series([1, 2, 3])
b = pd.Series([4, 5, 6])

c = pd.Series((b.values * a.values[:, None]).ravel())