遍历一个列表,应用一个函数,并将每个输出设置为pandas数据框的行。

问题描述 投票:0回答:1

所以我有以下数据,这些数据来自两个不同的pandas数据框。

lis = [] 

for index, rows in full.iterrows(): 
    my_list = [rows.ARIEL, rows.LBHD, rows.LFHD, rows.RFHD, rows.RBHD]    
    lis.append(my_list) 

lis2 = []

for index, rows in reduced.iterrows(): 
    my_list = rows.bar_head
    lis2.append(my_list) 

例如,部分数据 lislis 如下图所示。

lis = [[[-205.981, 1638.787, 1145.274], [-264.941, 1482.371, 1168.693], [-263.454, 1579.4370000000001, 1016.279], [-148.062, 1592.005, 1016.75], [-134.313, 1479.1429999999998, 1167.109]], ...

lis2 = [[-203.3502, 1554.3486, 1102.821], [-203.428, 1554.3492, 1103.0592], [-203.4954, 1554.3234, 1103.2794], [-203.5022, 1554.2974, 1103.4522], ...

我想使用的是 lislis2 用以下应用方法(其中 mdf 是另一个长度与其他两个相同的空数据帧,而 md 是我创建的一个函数)。)

 mdf['head_md'] = mdf['head_md'].apply(md, args=(5, lis, lis2))

但现在的做法是,它向所有的行输出相同的结果 mdf.

我想要的是让它循环通过 lislis2 并根据索引,将相应的结果输出到相应的行中。mdf. 所有数据帧和变量的长度都是7446。

我试过这样做,但没有效果。

for i in range(len(mdf)):
    for j in range(0, 5):
        mdf['head_md'] = mdf['head_md'].apply(md, args=(5, lis[i][j], lis2[i]))

如果你需要更多的代码信息,请告诉我,先谢谢你!

EDIT: 数据框的例子。

bar_head
0   [-203.3502, 1554.3486, 1102.821]
1   [-203.428, 1554.3492, 1103.0592]
2   [-203.4954, 1554.3234, 1103.2794]
3   [-203.5022, 1554.2974, 1103.4522]
4   [-203.5014, 1554.2948, 1103.6594]

  ARIEL   LBHD    LFHD    RBHD    RFHD
0   [-205.981, 1638.787, 1145.274]  [-264.941, 1482.371, 1168.693]  [-263.454, 1579.4370000000001, 1016.279]    [-134.313, 1479.1429999999998, 1167.109]    [-148.062, 1592.005, 1016.75]
1   [-206.203, 1638.649, 1145.734]  [-264.85400000000004, 1482.069, 1168.776]   [-263.587, 1579.6129999999998, 1016.627]    [-134.286, 1479.0839999999998, 1167.076]    [-148.21, 1592.3310000000001, 1017.0830000000001]
2   [-206.37599999999998, 1638.531, 1146.135]   [-264.803, 1481.8210000000001, 1168.8519999999...   [-263.695, 1579.711, 1016.922]  [-134.265, 1478.981, 1167.104]  [-148.338, 1592.5729999999999, 1017.3839999999...
3   [-206.493, 1638.405, 1146.519]  [-264.703, 1481.5439999999999, 1168.95] [-263.742, 1579.8139999999999, 1017.207]    [-134.15200000000002, 1478.922, 1167.112]   [-148.421, 1592.8020000000001, 1017.4730000000...
4   [-206.56900000000002, 1638.33, 1146.828]    [-264.606, 1481.271, 1169.0330000000001]    [-263.788, 1579.934, 1017.467]  [-134.036, 1478.888, 1167.289]  [-148.50799999999998, 1593.0510000000002, 1017...
python pandas loops apply
1个回答
0
投票

如果在 fullreduced 是列表,先把它们转换为numpy ndarrays。

ariel = np.array(full.ARIEL.to_list())
lbhd = np.array(full.LBHD.to_list())
lfhd = np.array(full.LFHD.to_list())
rfhd = np.array(full.RFHD.to_list())
rbhd = np.array(full.RBHD.to_list())

barhead = np.array(reduced.bar_head.to_list())

减去 barheadariel 使用 广播对结果进行平方,然后沿着最后一个轴进行求和(假设我理解了关于你的函数的评论)。

a = np.sum(np.square(ariel-barhead[:,None,:]),-1)

使用下面的设置,结果是一个(4,5)的数值数组(四舍五入到两位)。

>>> a #  a[0]     a[1]     a[2]     a[3]     a[4]
array([[8939.02, 8956.22, 8971.93, 8984.87, 8999.85],  # b[0]
       [8918.35, 8935.3 , 8950.79, 8963.53, 8978.35],  # b[1]
       [8903.82, 8920.53, 8935.82, 8948.36, 8963.04],  # b[2]
       [8893.7 , 8910.24, 8925.38, 8937.78, 8952.34]]) # b[3]

似乎你想要的是一个1-d的结果序列。a.ravel() 产生一个1 -d的数组,比如:

[(a[0]:b[0]),(a[1]:b[0]),(a[2]:b[0]),...,(a[0]:b[1]),(a[1]:b[1]),...,(a[0]:b[2]),...]

其他四列 full.

lb = np.sum(np.square(lbhd-barhead[:,None,:]),-1)
lf = np.sum(np.square(lfhd-barhead[:,None,:]),-1)
rf = np.sum(np.square(rfhd-barhead[:,None,:]),-1)
rb = np.sum(np.square(rbhd-barhead[:,None,:]),-1)

再次假设我理解了你的过程,结果将是100个值(使用下面的设置)。

     full          reduced
(rows * columns) *  (rows)

x = np.concatenate([a.ravel(),lb.ravel(),lf.ravel(),rf.ravel(),rb.ravel()])

设置

import numpy as np
import pandas as pd

lis = [[[-205.981, 1638.787, 1145.274],[-264.941, 1482.371, 1168.693],[-263.454, 1579.437, 1016.279],[-134.313, 1479.1429, 1167.109],[-148.062, 1592.005, 1016.75]],
       [[-206.203, 1638.649, 1145.734],[-264.854, 1482.069, 1168.776],[-263.587, 1579.6129, 1016.627],[-134.286, 1479.0839, 1167.076],[-148.21, 1592.331, 1017.083]],
       [[-206.3759, 1638.531, 1146.135],[-264.803, 1481.821, 1168.85199],[-263.695, 1579.711, 1016.922],[-134.265, 1478.981, 1167.104],[-148.338, 1592.5729, 1017.3839]],
       [[-206.493, 1638.405, 1146.519],[-264.703, 1481.5439, 1168.95],[-263.742, 1579.8139, 1017.207],[-134.152, 1478.922, 1167.112],[-148.421, 1592.802, 1017.473]],
       [[-206.569, 1638.33, 1146.828],[-264.606, 1481.271, 1169.033],[-263.788, 1579.934, 1017.467],[-134.036, 1478.888, 1167.289],[-148.5079, 1593.051, 1017.666]]]


barhd = [[[-203.3502, 1554.3486, 1102.821]],
        [[-203.428, 1554.3492, 1103.0592]],
        [[-203.4954, 1554.3234, 1103.2794]],
        [[-203.5022, 1554.2974, 1103.4522]]]

full = pd.DataFrame(lis, columns=['ARIEL', 'LBHD', 'LFHD', 'RFHD', 'RBHD'])
reduced = pd.DataFrame(barhd,columns=['bar_head'])

0
投票

希望能很好的理解你的意思,是你想要的吗?"v "是lis,"v2 "是lis2。

由2D求3D的算术函数。

import numpy as np
na = np.array

v=na([[[1, 2, 3], [4, 5, 6]], [[7,  8,  9],[ 10,  11, 1]]])

v2=na([[1, 2, 3], [4, 5, 6], [7,  8,  9],[ 10,  11, 12]])

lst = []
for a in v:
    for b in a:
        for a2 in v2:
            lst.append(b+a2) # you can do any arithmetic functions
© www.soinside.com 2019 - 2024. All rights reserved.