pandas 如何为Dataframe定义lambda函数

f0brbegy  于 2023-05-21  发布在  其他
关注(0)|答案(1)|浏览(98)

使用Pandas Dataframe,我打算将值存储在Dataframe中,这些值是从存储在同一Dataframe中的数据计算出来的。
在没有lambda的情况下尝试,它无法正常工作:

def fences(data):
    """
    Returns with the fences defined based on statistical quartiles
    
    data: Raw data
    
    return: DataFrame with X,Y,Z in columns ans Q1,Q2,Q3,IQR,F_l,F_h
    """
    
    dp = pd.DataFrame(index=["Q1","Q2","Q3","IQR","F_l","F_h"], columns=["X","Y","Z"])
    
    """Calculate quartiles"""
    dp.iloc[0:1,0:3] = record.iloc[:,1:4].quantile(.25)
    dp.iloc[1:2,0:3] = record.iloc[:,1:4].quantile(.5)
    dp.iloc[2:3,0:3] = record.iloc[:,1:4].quantile(.75)
    
    """Calculate IQRs"""
    dp.iloc[3:4,0:3] = dp.iloc[2:3,0:3] - dp.iloc[0:1,0:3]
    
    return dp

它会报告一个错误,如“ValueError:cannot broadcast input array from shape(2,3)into shape(1,3)”虽然我认为它可能会工作,因为索引和大小看起来很好,并且彼此适合:

所以我相信,解决方案可能是一个lambda函数,尽管它对我来说不是那么明显。
有人能帮我吗?
先谢谢你了。
更新日期:
形状如下:
Q1:

Q3:

因此,假设在减法之后,它给出(1,3),尽管它最终得到(2,3),这导致了错误......

行索引会导致这种混乱吗?

fiei3ece

fiei3ece1#

请允许我重新表述你的问题:

import pandas as pd

dp = pd.DataFrame(
    [[8.3275, 0.8725, -2.0275], [4.03, -6.215, -6.7025]],
    columns=["X", "Y", "Z"],
    index=["Q1", "Q2"],
)
print(dp)

a = dp.iloc[0:1, 0:3]
b = dp.iloc[1:2, 0:3]

print(f"a=\n{a}")
print(f"b=\n{b}")

c1 = a - b
print(f"c1=\n{c1}")

你的问题是“为什么两个向量ab的减法返回NaN”?

## Pandas dataframe
         X       Y       Z
Q1  8.3275  0.8725 -2.0275
Q2  4.0300 -6.2150 -6.7025

a=
         X       Y       Z
Q1  8.3275  0.8725 -2.0275

b=
       X      Y       Z
Q2  4.03 -6.215 -6.7025

# Results of subtraction
c1=
     X   Y   Z
Q1 NaN NaN NaN
Q2 NaN NaN NaN

回复

c2 = a.reset_index(drop=True) - b.reset_index(drop=True)
print(f"c2=\n{c2}")

a - b没有工作,因为iloc也考虑了索引,对dataframe进行了快照。这些行不仅仅是“数字”,还有其他信息,例如Q1Q3索引的位置不同。
你只是在寻找数字的减法。
一种方法是简单地使用iloc + reset_index()返回纯标量数的副本。

c2=
        X       Y      Z
0  4.2975  7.0875  4.675

相关问题