Python 如何使用应用于每行多个切片的函数转换熊猫中的数据帧?

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(

我想将函数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.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如果没有看到你的一些数据,绝对不可能说。例如,下面的代码将数据点转换成NaN
df=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