Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用“压缩重复代码”;至于;使用字符串的语句-Python_Python_Pandas_For Loop - Fatal编程技术网

使用“压缩重复代码”;至于;使用字符串的语句-Python

使用“压缩重复代码”;至于;使用字符串的语句-Python,python,pandas,for-loop,Python,Pandas,For Loop,我对Python中的“for”语句非常陌生,我无法得到我认为应该简单易用的东西。我的代码是: import pandas as pd df1 = pd.DataFrame({'Column1' : pd.Series([1,2,3,4,5,6])}) df2 = pd.DataFrame({'Column1' : pd.Series([1,2,3,4,5,6])}) df3 = pd.DataFrame({'Column1' : pd.Series([1,2,3,4,5,6])}) DF1

我对Python中的“for”语句非常陌生,我无法得到我认为应该简单易用的东西。我的代码是:

import pandas as pd

df1 = pd.DataFrame({'Column1' : pd.Series([1,2,3,4,5,6])})
df2 = pd.DataFrame({'Column1' : pd.Series([1,2,3,4,5,6])})
df3 = pd.DataFrame({'Column1' : pd.Series([1,2,3,4,5,6])})

DF1 = pd.DataFrame({'Column1' : pd.Series([1,2,3,4,5,6])})
DF2 = pd.DataFrame({'Column1' : pd.Series([1,2,3,4,5,6])})
DF3 = pd.DataFrame({'Column1' : pd.Series([1,2,3,4,5,6])})
然后:

A1=len(df1.loc[df1['Column1']=df1['Column1'].iloc[3]]
A2=len(df2.loc[df2['Column1']=df2['Column1'].iloc[3]]
A3=len(df3.loc[df3['Column1']=df3['Column1'].iloc[3]]
正如您所看到的,这是大量重复代码,只是识别号不同。因此,我第一次尝试使用“for”语句是:

Numbers = [1,2,3]

for i in Numbers:
    "A" + str(i) = len("df" + str(i).loc["df" + str(i)['Column1'] <= "DF" + str(i)['Column1'].iloc[2]])
    "Z" + str(i) = len("df" + str(i).loc["df" + str(i)['Column1'] >= "DF" + str(i)['Column1'].iloc[3]])
number=[1,2,3]
以数字表示的i:
“A”+str(i)=len(“df”+str(i).loc[“df”+str(i)[Column1']=“df”+str(i)[Column1'].iloc[3]])
这产生了SyntaxError:“无法分配给运算符”。所以我试着:

Numbers = [1,2,3]

for i in Numbers:
    A = "A" + str(i)
    Z = "Z" + str(i)
    A = len("df" + str(i).loc["df" + str(i)['Column1'] <= "DF" + str(i)['Column1'].iloc[2]])
    Z = len("df" + str(i).loc["df" + str(i)['Column1'] >= "DF" + str(i)['Column1'].iloc[3]])
number=[1,2,3]
以数字表示的i:
A=“A”+str(一)
Z=“Z”+str(一)
A=len(“df”+str(i).loc[“df”+str(i)[Column1']=“df”+str(i)[Column1'].iloc[3]]
这产生了AttributeError:“str”对象没有属性“loc”。我尝试了其他一些方法,如:

Numbers = [1,2,3]

for i in Numbers:
    A = "A" + str(i)
    Z = "Z" + str(i)
    df = "df" + str(i)
    DF = "DF" + str(i)
    A = len(df.loc[df['Column1'] <= DF['Column1'].iloc[2]])
    Z = len(df.loc[df['Column1'] <= DF['Column1'].iloc[3]])
number=[1,2,3]
以数字表示的i:
A=“A”+str(一)
Z=“Z”+str(一)
df=“df”+str(一)
DF=“DF”+str(一)
A=len(df.loc[df['Column1']在for循环中生成变量是“受限的”(您可以这样做,但最好避免。请参阅其他帖子:,)

相反,使用此代码来实现您的目标,而无需根据需要生成尽可能多的变量(实际上只生成for循环中的值):

#数据帧列表
Hanimals=[H26,H45,H46,H47,H51,H58,H64,H65]
Ianimals=[I26,I45,I46,I47,I51,I58,I64,I65]
#在上面的列表中使用for循环生成序列
BPM=pd.DataFrame({'BPM_Base':pd.Series([i_a for i_a in[len(i_h.loc[i_h['EKG-evt']=\
i_i[0].iloc[-1]]/30表示i_h,i_i在zip中(Hanimals,Ianimals)]})
更新

更有效的方法(仅在“动物”列表上迭代一次):

#数据帧列表
Hanimals=[H26,H45,H46,H47,H51,H58,H64,H65]
Ianimals=[I26,I45,I46,I47,I51,I58,I64,I65]
#您不需要使用pd.Series(),
#只需创建一个元组列表:[(A26,Z26),(A45,Z45)…]并对其进行迭代
BPM=pd.DataFrame({'BPM_Base':i[0],'BPM_Test':i[1]}用于中的i\
[(len(i_h.loc[i_h['EKG-evt']=i_i[0].iloc[-1]])/30)\
对于i_h,i_i in zip(Hanimals,Ianimals)])

找到了一种更好的方法来满足我的需要。这主要是为了让我能够找到我的方法

# Change/Add animals and conditions here, make sure they match up directly

Animal = ['26','45','46','47','51','58','64','65', '69','72','84']
Cond = ['Stomach','Intestine','Stomach','Stomach','Intestine','Intestine','Intestine','Stomach','Cut','Cut','Cut']    

d = []

def CuSO4():
    for i in Animal:

        # load in Spike data
        A = pd.read_csv('TXT/INJ/' + i + '.txt',delimiter=r"\s+", skiprows = 15, header = None, usecols = range(1))
        B = pd.read_csv('TXT/EKG/' + i + '.txt', skiprows = 3)
        C = pd.read_csv('TXT/ESO/' + i + '.txt', skiprows = 3) 
        D = pd.read_csv('TXT/TRACH/' + i + '.txt', skiprows = 3)
        E = pd.read_csv('TXT/BP/' + i + '.txt', delimiter=r"\s+").rename(columns={"4 BP": "BP"})


        # Count number of beats before/after injection, divide by 10/30 minutes for average BPM.
        F = len(B.loc[B['EKG-evt'] <= A[0].iloc[0]])/10   
        G = len(B.loc[B['EKG-evt'] >= A[0].iloc[-1]])/30


        # Count number of esophogeal events before/after injection
        H = len(C.loc[C['Eso-evt'] <= A[0].iloc[0]])
        I = len(C.loc[C['Eso-evt'] >= A[0].iloc[-1]])

        # Find Trach events after injection
        J = D.loc[D['Trach-evt'] >= A[0].iloc[-1]]

        # Count number of breaths before/after injection, divide by 10/30 min for average breaths/min
        K = len(D.loc[D['Trach-evt'] <= A[0].iloc[0]])/10
        L = len(J)/30

        # Use Trach events from J to find the number of EE
        M = pd.DataFrame(pybursts.kleinberg(J['Trach-evt'], s=4, gamma=0.1))
        N = M.last_valid_index()

        # Use N and M to determine the latency, set value to MaxTime (1800s)if EE = 0
        O = 1800 if N == 0 else M.iloc[1][1] - A[0].iloc[-1]

        # Find BP value before/after injection, then determine the mean value
        P = E.loc[E['Time'] <= A[0].iloc[0]]
        Q = E.loc[E['Time'] >= A[0].iloc[-1]]
        R = P["BP"].mean()
        S = Q["BP"].mean()

        # Combine all factors into one DF
        d.append({'EE' : N, 'EE-lat' : O,
          'BPM_Base' : F, 'BPM_Test' : G,
          'Eso_Base' : H, 'Eso_Test' : I,
          'Trach_Base' : K, 'Trach_Test' : L,
          'BP_Base' : R, 'BP_Test' : S})

CuSO4()

# Create shell DF with animal numbers and their conditions.

DF = pd.DataFrame({'Animal' : pd.Series(Animal), 'Cond' : pd.Series(Cond)})

# Pull appended DF from CuSO4 and make it a pd.DF
Df = pd.DataFrame(d)

# Combine the two DF's
df = pd.concat([DF, Df], axis=1)
df
#在此处更改/添加动物和条件,确保它们直接匹配
动物=['26'、'45'、'46'、'47'、'51'、'58'、'64'、'65'、'69'、'72'、'84']
Cond=[‘胃’、‘肠’、‘胃’、‘肠’、‘肠’、‘肠’、‘胃’、‘切’、‘切’、‘切’]
d=[]
def CuSO4():
对于动物中的i:
#加载峰值数据
A=pd.read_csv('TXT/INJ/'+i+'.TXT',分隔符=r“\s+”,skiprows=15,header=None,usecols=range(1))
B=pd.read_csv('TXT/EKG/'+i+'.TXT',skiprows=3)
C=pd.read_csv('TXT/ESO/'+i+'.TXT',skiprows=3)
D=pd.read_csv('TXT/TRACH/'+i+'.TXT',skiprows=3)
E=pd.read_csv('TXT/BP/'+i+'.TXT',分隔符=r“\s+”)。重命名(列={“4 BP”:“BP”})
#计算注射前/后的心跳次数,除以10/30分钟获得平均BPM。
F=len(B.loc[B['EKG-evt']=A[0].iloc[-1]])/30
#统计注射前后的食管事件数
H=len(C.loc[C['Eso-evt']=A[0].iloc[-1]]
#注射后查找Trach事件
J=D.loc[D['Trach-evt']>=A[0].iloc[-1]]
#计算注射前/后的呼吸次数,除以10/30分钟获得平均每分钟呼吸次数

K=len(D.loc[D['Trach-evt']可能是@ukaszRogalski的复制品这是如何工作的,我会将“x”定义为等于[26,45,46,47,51,58,64,65],然后键入“Ax=len(Hx.loc[Hx['EKG-evt']如果您将列一起提供给dataframe,这将是更好的代码,而不是为每个列指定一个列的命名变量。您的要求要求是对看起来像变量名的字符串使用
eval
exec
。所有这些努力都只是为了引用已经很好地表示的内容ED在另一个数据框里,你没有分享。我不会浪费我的时间去解决这个混乱。但是,如果你用原始数据问了一个类似的问题,我会考虑它。@ PrimaRead我简化了它,并做了一个原始数据示例。这是一个更有效的解决方案(只有2个
用于
循环,而不是4个)
Numbers = [1,2,3]

for i in Numbers:
     Ai = len(dfi.loc[dfi['Column1'] <= DFi['Column1'].iloc[2]])
     Zi = len(dfi.loc[dfi['Column1'] <= DFi['Column1'].iloc[3]])
A1 = len(df1.loc[df1['Column1'] <= DF1['Column1'].iloc[2]])  
Z1 = len(df1.loc[df1['Column1'] >= DF1['Column1'].iloc[3]])

A2 = len(df2.loc[df1['Column1'] <= DF2['Column1'].iloc[2]])  
Z2 = len(df2.loc[df1['Column1'] >= DF2['Column1'].iloc[3]])

A3 = len(df3.loc[df3['Column1'] <= DF3['Column1'].iloc[2]])  
Z3 = len(df3.loc[df3['Column1'] >= DF3['Column1'].iloc[3]])
# Lists of your dataframes
Hanimals = [H26, H45, H46, H47, H51, H58, H64, H65]
Ianimals = [I26, I45, I46, I47, I51, I58, I64, I65]

# Generate your series using for loops iterating through your lists above
BPM = pd.DataFrame({'BPM_Base':pd.Series([i_a for i_a in [len(i_h.loc[i_h['EKG-evt'] <=\
     i_i[0].iloc[0]]) / 10 for i_h, i_i in zip(Hanimals, Ianimals)]]),
    'BPM_Test':pd.Series([i_z for i_z in [len(i_h.loc[i_h['EKG-evt'] >=\
     i_i[0].iloc[-1]]) / 30 for i_h, i_i in zip(Hanimals, Ianimals)]])})
# Lists of your dataframes
Hanimals = [H26, H45, H46, H47, H51, H58, H64, H65]
Ianimals = [I26, I45, I46, I47, I51, I58, I64, I65]

# You don't need using pd.Series(),
# just create a list of tuples: [(A26, Z26), (A45, Z45)...] and iterate over it
BPM = pd.DataFrame({'BPM_Base':i[0], 'BPM_Test':i[1]} for i in \
    [(len(i_h.loc[i_h['EKG-evt'] <= i_i[0].iloc[0]]) / 10,
    len(i_h.loc[i_h['EKG-evt'] >= i_i[0].iloc[-1]]) / 30) \
    for i_h, i_i in zip(Hanimals, Ianimals)])
# Change/Add animals and conditions here, make sure they match up directly

Animal = ['26','45','46','47','51','58','64','65', '69','72','84']
Cond = ['Stomach','Intestine','Stomach','Stomach','Intestine','Intestine','Intestine','Stomach','Cut','Cut','Cut']    

d = []

def CuSO4():
    for i in Animal:

        # load in Spike data
        A = pd.read_csv('TXT/INJ/' + i + '.txt',delimiter=r"\s+", skiprows = 15, header = None, usecols = range(1))
        B = pd.read_csv('TXT/EKG/' + i + '.txt', skiprows = 3)
        C = pd.read_csv('TXT/ESO/' + i + '.txt', skiprows = 3) 
        D = pd.read_csv('TXT/TRACH/' + i + '.txt', skiprows = 3)
        E = pd.read_csv('TXT/BP/' + i + '.txt', delimiter=r"\s+").rename(columns={"4 BP": "BP"})


        # Count number of beats before/after injection, divide by 10/30 minutes for average BPM.
        F = len(B.loc[B['EKG-evt'] <= A[0].iloc[0]])/10   
        G = len(B.loc[B['EKG-evt'] >= A[0].iloc[-1]])/30


        # Count number of esophogeal events before/after injection
        H = len(C.loc[C['Eso-evt'] <= A[0].iloc[0]])
        I = len(C.loc[C['Eso-evt'] >= A[0].iloc[-1]])

        # Find Trach events after injection
        J = D.loc[D['Trach-evt'] >= A[0].iloc[-1]]

        # Count number of breaths before/after injection, divide by 10/30 min for average breaths/min
        K = len(D.loc[D['Trach-evt'] <= A[0].iloc[0]])/10
        L = len(J)/30

        # Use Trach events from J to find the number of EE
        M = pd.DataFrame(pybursts.kleinberg(J['Trach-evt'], s=4, gamma=0.1))
        N = M.last_valid_index()

        # Use N and M to determine the latency, set value to MaxTime (1800s)if EE = 0
        O = 1800 if N == 0 else M.iloc[1][1] - A[0].iloc[-1]

        # Find BP value before/after injection, then determine the mean value
        P = E.loc[E['Time'] <= A[0].iloc[0]]
        Q = E.loc[E['Time'] >= A[0].iloc[-1]]
        R = P["BP"].mean()
        S = Q["BP"].mean()

        # Combine all factors into one DF
        d.append({'EE' : N, 'EE-lat' : O,
          'BPM_Base' : F, 'BPM_Test' : G,
          'Eso_Base' : H, 'Eso_Test' : I,
          'Trach_Base' : K, 'Trach_Test' : L,
          'BP_Base' : R, 'BP_Test' : S})

CuSO4()

# Create shell DF with animal numbers and their conditions.

DF = pd.DataFrame({'Animal' : pd.Series(Animal), 'Cond' : pd.Series(Cond)})

# Pull appended DF from CuSO4 and make it a pd.DF
Df = pd.DataFrame(d)

# Combine the two DF's
df = pd.concat([DF, Df], axis=1)
df