如何使用 numpy 或 pandas 创建(或更改)数组/列表的维度?
Posted
技术标签:
【中文标题】如何使用 numpy 或 pandas 创建(或更改)数组/列表的维度?【英文标题】:How to create (or change) the dimensions of an array/list using numpy or pandas? 【发布时间】:2020-10-14 06:17:50 【问题描述】:我正在尝试创建一个 pandas DataFrame 来收集我拥有的所有内容,但是我很难将列表中的 numpy 数组组合成一个数组。
假设我有以下数据:
df0 = pd.DataFrame([[1,2],[2,2],[3,1],[4,4],[5,4]], columns = ['A','B'])
switch = [[1,3,4],[2,5]]
collect = []
for lists in switch:
mask = df0.A.isin(lists)
avg = df0[mask].mean().round(2)
collect.append(avg)
collect.append((avg[0]**2+avg[1]+2).round(2))
这会产生以下输出:
[A 2.67
B 2.33
dtype: float64,
11.46,
A 3.5
B 3.0
dtype: float64,
17.25]
但是,我想要以下输出:
A B C
2.67 2.33 11.46
3.5 3.0 17.25
但我无法创建 2x3 矩阵,因为 len(collect) 为 4。我认为我在 for 循环中没有以正确的方式使用 .append。如何创建 len(collect) 为 2 或 6 的数组(或列表)?我在想如果它的长度为 2,我们可以简单地转置 collect,或者它的长度为 6,我们可以重塑它。
【问题讨论】:
【参考方案1】:其他解决方案在这里
import pandas as pd
df0 = pd.DataFrame([[1,2],[2,2],[3,1],[4,4],[5,4]], columns = ['A','B'])
switch = [[1,3,4],[2,5]]
collect = []
def calc(first,second):
cal=((first**2+second+2).round(2))
return cal
for lists in switch:
mask = df0.A.isin(lists)
avg = df0[mask].mean().round(2)
collect.append(avg)
df=pd.DataFrame(collect)
df['c']='None'
for i in range(2) :
list=[df.apply(lambda row : calc(df.loc[i, "A"], df.loc[i, "B"]),axis=1) ]
df['c'][i]=list[0][i]
print(df)
输出
A B c
0 2.67 2.33 11.46
1 3.50 3.00 17.25
【讨论】:
【参考方案2】:我的做法:
(df0.groupby(pd.Series(x-1:k for k,v in enumerate(switch) for x in v))
.mean()
.assign(C=lambda x: x['A']**2 + x['B']+2)
.round(2)
)
输出:
A B C
0 2.67 2.33 11.44
1 3.50 3.00 17.25
【讨论】:
以上是关于如何使用 numpy 或 pandas 创建(或更改)数组/列表的维度?的主要内容,如果未能解决你的问题,请参考以下文章
如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?
如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?
如何在不使用 Pandas 的情况下创建等效于 numpy.nan 的日期时间对象?