【问题标题】:Multiply values in a DataFrame if certain element is recognized如果识别出某个元素,则将 DataFrame 中的值相乘
【发布时间】:2019-03-01 03:39:32
【问题描述】:

我正在尝试制作一个程序,如果在其中识别出某个元素,它将乘以 Dataframe 行。例如,假设我有一个数据框:

A B C  D   E  F  G
1 0 -1 2  -4  C  5
4 1  5 7 -0.2 E  7

每当 F 列包含一个字母时,除了最后一列外,它应该使用以下数字乘以该行: C= 2.8 E=1.4

所以最终的输出会是这样的:

A   B   C    D     E    F  G
2.8 0  -2.8 5.6  -11.2  C  5
5.6 1.4  7  9.8  -0.28  E  7 

这是我尝试使用的代码:

import pandas as pd
import csv  

data= pd.read_csv("file.txt", sep= '\t')        
U= data.drop('xyz', axis= 1)

for col in U:
    U=col * 2.63

for Z in U:
    Z= pd.DataFrame(U)

with open('File.tbl', 'r') as  f:       
    P=list(f)
    del P[0]

B=[]
O=[]
for o in P:
    J=o.split()
    B.append(J[:4])
    T=(J[3:4])
    O.append(J[2:3])

column=['A','B','C','D']
Y= pd.DataFrame(B, columns= column)
D= Y.drop(0)
D=D.reset_index(drop=True)
M = pd.concat([Z, D], sort=False, axis= 1)    #Concatenating both the dataframes
S= pd.DataFrame(M)  

x=O
while True:
    x= C = 2.8
    x= E = 1.4

    col_Number = col + '_Number'
    Z[col_Number] = (Z[col]*(x) - Z.max()) / Z.max() - Z.min() #multiply the Z-score rows

在运行这个程序时,它显示 None 并且只显示最后一列,即。 E. 上述公式从每一列中选择最大值和最小值并进行计算。 Z[col] 是行值,即。 1、0、-1等要相乘。

我尝试过使用 loc 方法,但没有帮助。任何帮助将不胜感激。

【问题讨论】:

    标签: python python-3.x dataframe formula matrix-multiplication


    【解决方案1】:

    经过一番研究。

    df.loc[df['F'] == 'C', ['A', 'B']] = df[['A', 'B']].apply(lambda x: x*2.8)
    

    通用术语df.loc[condition,[list of columns]] = df [[list of columns]].apply()

    同样,您可以在不同的语句中为不同的列使用不同的乘法因子。

    【讨论】:

    • 谢谢回复,能不能具体说明一下2的作用是什么或者你想写2.8那里?
    • @Dustrokes 我以为你想将这些值乘以 2,如果你必须乘以 2.8,那么它将变为 lambda x: x*2.8
    • 是的,它正在工作,可以请告诉我如何编写这个数学公式,以便它可以给我想要的结果。你的答案是找到残差并将其相乘,我想执行这个数学过程来得到结果。 Z[col_Number] = (Z[col]*(x) - Z.max()) / Z.max() - Z.min()
    • @Dustrokes 如果要将不同的常数与不同的列相乘,则必须分别为每列计算常数,并为每列单独使用该命令,然后在 lambda 函数中使用该命令常数。
    • 是的,谢谢。虽然它需要额外的行,但它可以工作,谢谢。
    【解决方案2】:

    您可以创建一个包含F 列的键和要相乘的相应值的字典。遍历字典以选择您需要的行,应用乘法并重新分配。

    df = pd.DataFrame({'A': [1, 4],
                       'B': [0, 1],
                       'C': [-1, 5],
                       'D': [2, 7],
                       'E': [-4.0, -0.2],
                       'F': ['C', 'E'],
                       'G': [5, 7]})
    
    mapping = dict(C=2.8, E=1.4)
    
    for k in mapping:
        ix = df.eval(f'F=="{k}"')
        df.loc[ix, list('ABCDE')] = df.loc[ix, list('ABCDE')] * mapping.get(k)
    
    df 
    # returns:
         A    B    C    D      E  F  G
    0  2.8  0.0 -2.8  5.6 -11.20  C  5
    1  5.6  1.4  7.0  9.8  -0.28  E  7
    

    【讨论】:

    • 感谢您的即时回复,我尝试了这段代码,但它给了我这个错误:TypeError:无法使用块值操作 2.8 无法将序列乘以“浮点”类型的非整数。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多