Python 如何使用应用于每行多个切片的函数转换熊猫中的数据帧?
我想将函数f应用于数据帧每行中的多个切片。 例如,数据帧df看起来是这样的:Python 如何使用应用于每行多个切片的函数转换熊猫中的数据帧?,python,pandas,Python,Pandas,我想将函数f应用于数据帧每行中的多个切片。 例如,数据帧df看起来是这样的: df = pandas.DataFrame(np.round(np.random.normal(size=(2,49)), 2)) 因此,我有一个2行49列的数据帧,我的函数需要应用于这两行中7个数据点的每个后续切片,这样生成的数据帧看起来与输入数据帧相同 我是这样做的: df1=df.copy() df1.T[:7], df1.T[7:14], df1.T[14:21],..., df1.T[43:50] = f(
df = pandas.DataFrame(np.round(np.random.normal(size=(2,49)), 2))
因此,我有一个2行49列的数据帧,我的函数需要应用于这两行中7个数据点的每个后续切片,这样生成的数据帧看起来与输入数据帧相同
我是这样做的:
df1=df.copy()
df1.T[:7], df1.T[7:14], df1.T[14:21],..., df1.T[43:50] = f(df.T.iloc[:7,:]), f(df.T.iloc[7:14,:]),..., f(df.T.iloc[43:50,:])
正如您所看到的,这是一大堆冗余代码。。因此,我想创建一个循环或其他东西,以便它将函数应用于每7个后续数据点。。。
我不知道该怎么做。有没有更优雅的方法
我想我可以使用一个转换函数来实现这一点,但在pandas文档中,我只能看到它应用于已分组的数据帧,而不是数据片上的数据帧
希望这是清楚的。。让我知道
谢谢。为了避免冗余代码,您可以执行如下循环:
STEP = 7
for i in range(0,len(df),STEP):
df1.T[i:i+STEP] = f(df1.T[i:i+STEP]) # could also do an apply here somehow, depending on what you want to do
不要重复你自己
你没有提供任何你想要的输出的例子,所以这里是我对你想要的最好的猜测
如果您的数据被归为七组,那么您需要想出一种方法来标记它们
换句话说,如果您希望使用任意数组,请使用numpy。如果您想处理有标签的、有意义的数据及其关联的元数据,请使用pandas
此外,pandas在操作(和显示!)行数据时工作效率更高。因此,平均存储数据长(49x2),而不是宽(2x49)
这里有一个例子来说明我的意思。我有相同的49x2随机数组,但提前为行分配了分组标签
是的,你正在阅读一些广泛的数据,如下所示:
import pandas
import numpy
from io import StringIO # python 3
# from StringIO import StringIO # python 2
datafile = StringIO("""\
A,B,C,D,E,F,G,H,I,J
0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9
1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9
2.0,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9
""")
df = pandas.read_csv(datafile)
print(df)
A B C D E F G H I J
0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
1 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9
2 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9
可以向列中添加群集值,如下所示:
cluster_size = 3
col_vals = []
for n, col in enumerate(df.columns):
cluster = int(n/cluster_size)
col_vals.append((cluster, col))
df.columns = pandas.Index(col_vals)
print(df)
0 1 2 3
A B C D E F G H I J
0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
1 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9
2 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9
默认情况下,groupby
方法尝试对行进行分组,但您可以在创建对象时通过传递axis=1
对列进行分组(我刚刚忘记了这一点)。因此,每行的每一组列的总和如下所示:
df.groupby(axis=1, level=0).sum()
0 1 2 3
0 0.3 1.2 2.1 0.9
1 3.3 4.2 5.1 1.9
2 6.3 7.2 8.1 2.9
但同样,如果你所做的只是更多的“全球”运营,那么就没有必要这样做。
就地柱群操作
就地行操作
一次对整个数据帧进行操作
如果要将相同的函数应用于所有组,为什么不将其应用于整个数据帧?函数是否以某种方式聚合值?为什么?(如果您只是简单地包含一些您希望看到的示例输出,那么所有这些问题都可以避免)首先,我想说,我已经学习了基本python,并介绍了pandas,但我有点被pandas压倒了。。因此,我发现很难将我最终的目标分解成一个问题,所以我认为分步走,相互补充,最终了解全貌更有意义,但我担心这会让我看起来像是在重复我自己。但是,是的,我想我要做的一件事是将矩阵转换成相同大小的输出矩阵,而不是聚合-但主要是我需要将函数应用到输入矩阵行的切片上..因此,如果使用相同的函数,为什么必须将其分为多个组,这一点一点也不清楚。换句话说,您可以像对单个值一样对列进行操作,但操作将被矢量化。试一试:
df['f(A)]=f(df['A'])
我需要一些时间来理解你的答案,但这对我来说是非常有用的信息。我确实希望最终能够流利地应用这些东西,但不知道如何使用熊猫进行整个索引和分组。学习代码和完成项目之间的微妙平衡…我将尝试将您的答案应用到我的需求中。非常感谢。从文件中读取我的数据,并尝试将索引应用于(43,49)df。我将所有索引作为元组列表(idx\u tuple),然后通过index=pd.MultiIndex.from\u tuple(idx\u tuple,names=['nr','date\u sample','month','conc','time'])创建多索引。
。现在尝试更新我的df如下:df1=pd.DataFrame(data=df,index=index,columns=range(43)
索引看起来不错,但我的数据都转换成了NaN。我做错了什么?@OakAnder114如果没有看到你的一些数据,绝对不可能说。例如,下面的代码将数据点转换成NaNdf=pd.DataFrame(np.round(np.random.normal)(大小=(5,6)),2))
ind1=[1','2','3','4','5']
ind2=[15','15','15','30','30']
ind=[ind1,ind2]
df1=pd.DataFrame(df,index=ind)
我也尝试了df.reindex(index=ind)
@OakAnder114同样,不要在注释中添加代码——编辑您的问题以反映您的尝试。我将不断重复这一点,直到您真正这样做:在您的问题中添加您所需输出的示例——这允许我们在了解您的实际含义时跳过如此多的迭代。问题是,这个问题具有sid电子追踪到其他问题。如果我更新了这个问题,它会变成一个完全不同的性质。那么打开一个新问题不是更好吗?谢谢
df[0] *= 5
print(df)
0 1 2 3
A B C D E F G H I J
0 0 2.5 5 0.3 0.4 0.5 0.6 0.7 0.8 0.9
1 25 27.5 30 1.3 1.4 1.5 1.6 1.7 1.8 1.9
2 50 52.5 55 2.3 2.4 2.5 2.6 2.7 2.8 2.9
df.T[0] += 20
0 1 2 3
A B C D E F G H I J
0 20 22.5 25 20.3 20.4 20.5 20.6 20.7 20.8 20.9
1 25 27.5 30 1.3 1.4 1.5 1.6 1.7 1.8 1.9
2 50 52.5 55 2.3 2.4 2.5 2.6 2.7 2.8 2.9
def myFunc(x):
return 5 + x**2
myFunc(df)
0 1 2 3
A B C D E F G H I J
0 405 511.25 630 417.09 421.16 425.25 429.36 433.49 437.64 441.81
1 630 761.25 905 6.69 6.96 7.25 7.56 7.89 8.24 8.61
2 2505 2761.25 3030 10.29 10.76 11.25 11.76 12.29 12.84 13.41