Python 如何遍历行中的列以找到满足某些条件的第一列

Python 如何遍历行中的列以找到满足某些条件的第一列,python,pandas,Python,Pandas,我需要遍历数据帧行中的列,以找到第一个完全大写的单元格(在此给定行中)。我需要对dataframe中的所有行重复此操作,最后输出一个包含一列的dataframe,每行包含相应的第一个大写字符串 例如,这可能是输入数据帧: +-----+--------+--------+--------+------+ | 0 | 1 | 2 | 3 | 4 | +-----+--------+--------+--------+------+ | a | Amoun

我需要遍历数据帧行中的列,以找到第一个完全大写的单元格(在此给定行中)。我需要对dataframe中的所有行重复此操作,最后输出一个包含一列的dataframe,每行包含相应的第一个大写字符串

例如,这可能是输入数据帧:

+-----+--------+--------+--------+------+
|  0  |   1    |   2    |   3    |  4   |
+-----+--------+--------+--------+------+
| a   | Amount | SEQ    | LTOTAL | None |
| BBc | LCALC  | None   | None   | None |
| c   | LCALC  | None   | None   | None |
| Dea | RYR    | LTOTAL | None   | None |
+-----+--------+--------+--------+------+
+-------+
| SEQ   |
| LCALC |
| LCALC |
| RYR   |
+-------+
我需要输出如下,在一个单独的数据帧中:

+-----+--------+--------+--------+------+
|  0  |   1    |   2    |   3    |  4   |
+-----+--------+--------+--------+------+
| a   | Amount | SEQ    | LTOTAL | None |
| BBc | LCALC  | None   | None   | None |
| c   | LCALC  | None   | None   | None |
| Dea | RYR    | LTOTAL | None   | None |
+-----+--------+--------+--------+------+
+-------+
| SEQ   |
| LCALC |
| LCALC |
| RYR   |
+-------+

如果需要,通过
isupper
检查所有列的测试值,并将不匹配的值替换为
NaN
s,这样就可以通过
iloc
重新填充缺失的值并查看LCT第一列:

df = df.where(df.applymap(lambda x: x.isupper())).bfill(axis=1).iloc[:, 0].to_frame('col')
print (df)
     col
0    SEQ
1  LCALC
2  LCALC
3    RYR
编辑:

通过匹配值的位置创建列
df1
,因此第一列是第一个上限值,…:

#reshape by stack, None and NaNs columns are removed, 
#remove second level of MultiIndex
s = df.stack().reset_index(level=1, drop=True)
#filter only upper values, convert to DataFrame
df1  = s[s.str.isupper()].rename_axis('idx').reset_index(name='val')
#create counter column for count first, second... columns
df1['g'] = df1.groupby('idx').cumcount()
#reshape by pivot and if necessary add non upper rows
df1 = df1.pivot('idx','g','val').reindex(df.index)
print (df1)
g      0       1
0    SEQ  LTOTAL
1  LCALC     NaN
2  LCALC     NaN
3    RYR  LTOTAL

first = df1[0].to_frame('col')
second = df1[1].to_frame('col')
print (first)
    col
0    SEQ
1  LCALC
2  LCALC
3    RYR

print (second)
      col
0  LTOTAL
1     NaN
2     NaN
3  LTOTAL

如果需要,通过
isupper
检查所有列的测试值,并将不匹配的值替换为
NaN
s,这样就可以通过
iloc
重新填充缺失的值并查看LCT第一列:

df = df.where(df.applymap(lambda x: x.isupper())).bfill(axis=1).iloc[:, 0].to_frame('col')
print (df)
     col
0    SEQ
1  LCALC
2  LCALC
3    RYR
编辑:

通过匹配值的位置创建列
df1
,因此第一列是第一个上限值,…:

#reshape by stack, None and NaNs columns are removed, 
#remove second level of MultiIndex
s = df.stack().reset_index(level=1, drop=True)
#filter only upper values, convert to DataFrame
df1  = s[s.str.isupper()].rename_axis('idx').reset_index(name='val')
#create counter column for count first, second... columns
df1['g'] = df1.groupby('idx').cumcount()
#reshape by pivot and if necessary add non upper rows
df1 = df1.pivot('idx','g','val').reindex(df.index)
print (df1)
g      0       1
0    SEQ  LTOTAL
1  LCALC     NaN
2  LCALC     NaN
3    RYR  LTOTAL

first = df1[0].to_frame('col')
second = df1[1].to_frame('col')
print (first)
    col
0    SEQ
1  LCALC
2  LCALC
3    RYR

print (second)
      col
0  LTOTAL
1     NaN
2     NaN
3  LTOTAL

您可以使用

column=list()
对于,df.iterrows()中的行:
对于第行中的项目:
如果item.isupper():
列。追加(项)
打破
其他:
column.append(numpy.nan)
new_df=pandas.DataFrame(列)

您可以使用

column=list()
对于,df.iterrows()中的行:
对于第行中的项目:
如果item.isupper():
列。追加(项)
打破
其他:
column.append(numpy.nan)
new_df=pandas.DataFrame(列)

使用以下代码迭代该行,并在该行中的所有caps单元格的第一个实例处中断

import pandas as pd
l=[]
for index,row in df.iterrows():
    for i in row:
            if(i.isuppercase()):
                    l.append(i)
                    break
new_df = pandas.DataFrame(l)

使用以下代码遍历该行,并在该行中的all caps单元格的第一个实例处中断

import pandas as pd
l=[]
for index,row in df.iterrows():
    for i in row:
            if(i.isuppercase()):
                    l.append(i)
                    break
new_df = pandas.DataFrame(l)

您尝试了什么?@Itay使用枚举(df.columns)尝试了一个for循环,但没有成功。您尝试了什么?@Itay使用枚举(df.columns)尝试了一个for循环但是如果有没有大写的行/没有出现任何行,则无法使用ITI执行任何操作-如何修改代码以不返回以下错误:AttributeError:(“'NoneType'对象没有属性'isupper'”)。我希望它返回一个None值来代替大写字符串在列表中的位置。我已经尝试过尝试和except,但不确定在except语句下放置什么。@user1611612然后使用
df=df.where(df.fillna('not').applymap(lambda x:x.isupper()).bfill(axis=1.iloc[:,0.)。to_frame('col')print(df)
谢谢-最后一个问题,假设我想返回新数据框中行的第二个大写值,现在我该如何修改它。@user1612-您只需要第一个、第二个ot以及第三个、第四个?如果有没有大写的行/不存在任何行-如何修改代码以不返回以下错误:AttributeError:(“'NoneType'对象没有属性'isupper'”)。我希望它返回一个None值来代替大写字符串在列表中的位置。我已经尝试过尝试和except,但不确定在except语句下放置什么。@user1611612然后使用
df=df.where(df.fillna('not').applymap(lambda x:x.isupper()).bfill(axis=1.iloc[:,0.)。to_frame('col')print(df)
谢谢-最后一个问题,假设我想返回新数据框中行的第二个大写值,现在我该如何修改它。@user1612-您只需要第一个、第二个ot以及第三个、第四个?如果有没有大写的行/不存在任何行-如何修改代码以不返回以下错误:AttributeError:(“'NoneType'对象没有属性'isupper'”)。我希望它返回一个None值来代替大写字符串在列表中的位置。我尝试了以下操作:
def get_first_upper(row):for val in row:if val.isupper():return val if AttributeError:return None df3=df2.apply(get_first_upper)
如果有没有大写的行/没有大写的行-如何修改代码以不返回以下错误:AttributeError:(“'NoneType'对象没有属性'isupper'”。我希望它返回一个None值来代替大写字符串在列表中的位置。我尝试了以下操作:
def get_first_upper(行):for val in row:if val.isupper():return val if AttributeError:return None df3=df2.apply(get_first_upper)