【问题标题】:Struggle with iterrows using python pandas [duplicate]使用 python pandas 与 iterrows 作斗争 [重复]
【发布时间】:2017-06-22 11:27:07
【问题描述】:

我有一个混合状态和区域的数据框。 这些值有 [edit] 表示美国的州。

    RegionName
0   Alabama[edit]
1   Auburn [1]
2   Florence
3   Jacksonville [2]
4   Livingston [2]
5   Montevallo [2]
6   Troy [2]
7   Tuscaloosa [3][4]
8   Tuskegee [5]
9   Alaska[edit]    

我想要的结果是

    State               RegionName
0   Alabama[edit]       Auburn[1]
1                       Florence
2                       Jacksonville [2]
3                          ...
4   Alaska[edit]           ...   

我尝试使用下面的代码但失败了

for row in df.iterrows():
    if row['RegionName'][-6:] == '[edit]':
        row['state'] = row[:-6]

错误信息是

TypeError: tuple indices must be integers or slices, not str

有人可以给我一些建议吗?谢谢

【问题讨论】:

  • 哦!非常感谢。这真的很有帮助。

标签: python pandas


【解决方案1】:

您可以使用mask,选择最后六个字符indexing with str

mask = df.RegionName.str[-6:] != '[edit]'
print (mask)
0    False
1     True
2     True
3     True
4     True
5     True
6     True
7     True
8     True
9    False
Name: RegionName, dtype: bool

#filter by mask and replace NaN by forward filling
df['State'] = df.RegionName.mask(mask).ffill()
#remove same values in both columns
df = df[df.State != df.RegionName]
print (df)
          RegionName          State
1         Auburn [1]  Alabama[edit]
2           Florence  Alabama[edit]
3   Jacksonville [2]  Alabama[edit]
4     Livingston [2]  Alabama[edit]
5     Montevallo [2]  Alabama[edit]
6           Troy [2]  Alabama[edit]
7  Tuscaloosa [3][4]  Alabama[edit]
8       Tuskegee [5]  Alabama[edit]
#keep only first duplicates, another replace by empty string
df['State'] = df.State.mask(df.State.duplicated(), '')
#change order of columns
df = df[['State','RegionName']].reset_index(drop=True)
print (df)
           State         RegionName
0  Alabama[edit]         Auburn [1]
1                          Florence
2                  Jacksonville [2]
3                    Livingston [2]
4                    Montevallo [2]
5                          Troy [2]
6                 Tuscaloosa [3][4]
7                      Tuskegee [5]

但如果需要删除 [] 并且数字是可能的,请使用修改后的 answer:

df.insert(0, 'State', df['RegionName'].str.extract('(.*)\[edit\]', expand=False).ffill())
df = df[~df['RegionName'].str.contains('\[edit\]')].reset_index(drop=True)
#change ( to [
df['RegionName'] = df['RegionName'].str.replace(r' \[.+$', '')
print (df)
     State    RegionName
0  Alabama        Auburn
1  Alabama      Florence
2  Alabama  Jacksonville
3  Alabama    Livingston
4  Alabama    Montevallo
5  Alabama          Troy
6  Alabama    Tuscaloosa
7  Alabama      Tuskegee

df['State'] = df.State.mask(df.State.duplicated(), '')
print (df)
     State    RegionName
0  Alabama        Auburn
1               Florence
2           Jacksonville
3             Livingston
4             Montevallo
5                   Troy
6             Tuscaloosa
7               Tuskegee

通过评论编辑:

有多个问题,如果需要非常慢的循环解决方案:

#add i for index value else get tuples
for i, row in df.iterrows():
    print (row)
    if row['RegionName'][-6:] == '[edit]':
        #for appending new column with values use loc 
        df.loc[i, 'state'] = row['RegionName'][:-6]

print (df)
         RegionName    state
0     Alabama[edit]  Alabama
1        Auburn [1]      NaN
2          Florence      NaN
3  Jacksonville [2]      NaN
4    Livingston [2]      NaN
5    Montevallo [2]      NaN

【讨论】:

  • 非常感谢!这真的很有帮助。另外,你知道我的错误信息吗?
  • 请检查已编辑的答案。
猜你喜欢
  • 2021-04-30
  • 2021-03-22
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 2015-12-07
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多