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