Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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_Dataframe_Data Science - Fatal编程技术网

Python 为多列应用多数据帧中的循环?

Python 为多列应用多数据帧中的循环?,python,pandas,dataframe,data-science,Python,Pandas,Dataframe,Data Science,Dataframe如下所示:如果年龄超过100,我想将dataframes值更改为“死” import pandas as pd raw_data = {'age1': [23,45,210],'age2': [10,20,150],'name': ['a','b','c']} df = pd.DataFrame(raw_data, columns = ['age1','age2','name']) raw_data = {'age1': [80,90,110],'age2': [70,120

Dataframe如下所示:如果年龄超过100,我想将dataframes值更改为“死”

import pandas as pd
raw_data = {'age1': [23,45,210],'age2': [10,20,150],'name': ['a','b','c']}
df = pd.DataFrame(raw_data, columns = ['age1','age2','name'])

raw_data = {'age1': [80,90,110],'age2': [70,120,90],'name': ['a','b','c']}
df2 = pd.DataFrame(raw_data, columns = ['age1','age2','name'])
预期结果

df=
    age1    age2    name
0   23      10       a
1   45      20       b
2   dead    dead     c

df2=
    age1    age2    name
0   80      70       a
1   90      dead     b
2   dead    90       c
我试着这样做:

col_list=['age1','age2']
df_list=[df,df2]

def dead(df):
  for df in df_list:
    if df.columns in col_list:
      if df.columns >=100:
        return 'dead'
    else:
      return df.columns

df.apply(dead)
错误显示: 包含多个元素的数组的真值不明确。使用a.any()或a.all()

我正在寻找一个可以在所有数据帧上工作的循环

请更正我的函数以备将来学习:)

我做了以下操作:

col_list=['age1','age2']
df_list=[df,df2]

for d in df_list:
    for c in col_list:
        d.loc[d[c]>100, c] = 'dead'

有了您展示的样品,请尝试以下内容。熊猫的用途、功能、numpy

c = df.filter(regex='age\d+').columns
df[c] = np.where(df[c].ge(100),'dead',df[c])
df


使用
的替代方法,其中

c=df.filter(like='age').columns
df[c] = df[c].where(~df['c'].ge(100),'dead')
说明:

  • 在c变量中获取与
    age
    同名的列
  • 然后使用
    np.where
    检查相应的(所有年龄列)是否为greeter/等于100,如果是,则将其设置为dead或保持原样

一种可能的解决方案是使用Pandas的
掩码
,它类似于
if-else
,但已矢量化

def dead(df):
    col_list = ['age1', 'age2']
    df = df.copy()
    temporary = df.filter(col_list)
    temporary = temporary.mask(temporary >= 100, "dead")
    df.loc[:, col_list] = temporary
    return df
将函数应用于数据帧:

df.pipe(dead)
 
   age1  age2 name
0    23    10    a
1    45    20    b
2  dead  dead    c
你可以做:

def check_more_than_100(x):
    v = None
    try:
        v = int(x)
    except:
        pass
    if v is not None:
        return (v > 100)
    return (False)
    
df['age1'] = df['age1'].apply(lambda x : 'dead' if check_more_than_100(x) else x)
df['age2'] = df['age2'].apply(lambda x : 'dead' if check_more_than_100(x) else x)

df2['age1'] = df2['age1'].apply(lambda x : 'dead' if check_more_than_100(x) else x)
df2['age2'] = df2['age2'].apply(lambda x : 'dead' if check_more_than_100(x) else x)
这应该考虑非int值(如果有的话)。

我曾经问过类似的问题。基本上,您可以使用numpy中的.where()函数根据条件进行设置

import pandas as pd
import numpy as np
raw_data = {'age1': [23,45,210],'age2': [10,20,150],'name': ['a','b','c']}
df = pd.DataFrame(raw_data, columns = ['age1','age2','name'])

raw_data = {'age1': [80,90,110],'age2': [70,120,90],'name': ['a','b','c']}
df2 = pd.DataFrame(raw_data, columns = ['age1','age2','name'])

col_list=['age1','age2']
df_list=[df,df2]

def dead(df_list, col_list):
    for df in df_list:
        for col in col_list:
            df[col] = np.where(df[col] >= 100, "dead", df[col])
    return df_list


df

dead([df], col_list)

提取数字列,然后使用numpy where-

df_cols  = df._get_numeric_data().columns.values
df2_cols  = df2._get_numeric_data().columns.values
df[df_cols] = np.where(df[df_cols].to_numpy() > 100, 'dead', df[df_cols])
df2[df2_cols] = np.where(df2[df2_cols].to_numpy() > 100, 'dead', df2[df2_cols])
#灵感来源于“三角帆”和“峡谷”

col_list=['age1','age2']
df_list=[df,df2]

for d in df_list:
  for c in col_list:
    d[c]=np.where(d[c]>100,'dead',d[c])
df #or df2
输出:

   age1  age2 name
0    23    10    a
1    45    20    b
2  dead  dead    c

错误是您试图在数组上使用逻辑,而不是它无法使用的值。例如,如果值==0;这对value很好,只要它不是一个值数组。另外,您有def dead(df),但也可以在df_列表中使用df。因此,您有两次df。这是混乱的,不建议这样做。这可能会引起一些问题。更改其中一个及其相关变量。此外,使用where子句代替遍历数据帧。在大熊猫的鳞片上反复出现,真可怕。谢谢,我实际上是在寻找一个for循环,因为我不能在数据帧列表上应用这个乐趣。你可以在df本身上做一个where,它更快,对吗?@JustinOberle,
np。where
where
在逻辑上同样有效。有时
np。其中
也更快。好的,谢谢。我不确定。@JustinOberle,我也在这里添加了带有
where
的答案,以及文档链接和解释,干杯。