从熊猫数据框中提取单个值

时间:2019-05-17 13:06:04

标签: python pandas dataframe

在Python中,我尝试从Pandas数据框中提取单个值。我确切知道值包含的内容,我只需要在数据框中的任何位置找到它并将其提取即可。

例如,在下面的数据框中:

df = pd.DataFrame(
        {0: ['BA1234', 'CA:1234', 'DA','DA1234', 'EX DA', 'CA1234'],
         1: ['BA1234', 'CA:1234', 'DA','CA1234', 'EX DA', 'CA1234'],
         2: ['BA1234', 'CA:1234', 'DA','CA1234', 'EX DA', 'CA1234']})

我想提取包含两个字母'DA'并紧随其后的4位数字的字符串。

我一直在尝试使用面具:

mask = pd.DataFrame(np.column_stack([df[col].str.contains('^DA\d{4}', na = False) for col in df]))

似乎可行:

da_value = df[mask]

da_value
        0    1    2
0     NaN  NaN  NaN
1     NaN  NaN  NaN
2     NaN  NaN  NaN
3  DA1234  NaN  NaN
4     NaN  NaN  NaN
5     NaN  NaN  NaN

但是,如何从数据框中提取值?有没有更好/更简便的方法?

编辑:我真正想要的输出是

da_value = 'DA1234'

4 个答案:

答案 0 :(得分:3)

首先将DataFrame.stack用于Series,然后用boolean indexingSeries.str.contains进行过滤:

s = df.stack()
a = s[s.str.contains(r'^DA\d{4}', na=False)].tolist()

如果需要列表中的第一个值,则可以选择:

print (a[0])
DA1234

或一般解决方案(如果可能)不存在任何值,则添加默认值:

print (next(iter(a), 'no match'))
DA1234

答案 1 :(得分:2)

您可以使用df.apply()series.str.contains()df.any()一起应用到axis=1之上,以获取任何列与模式匹配的行:

df[df.apply(lambda x: x.str.contains(r'^DA\d{4}', na=False)).any(axis=1)]

        0       1       2
3  DA1234  CA1234  CA1234

答案 2 :(得分:1)

如果您只希望字符串符合条件的行,则下面的方法有效

使用re.findall

    boundingObject Transform {
      translation %{= size.x / 2 }% 0 %{= size.y / 2 }%
      children Plane {
        size IS size
      }
    }

输出

df.loc[df.apply(lambda x: True if re.findall('^DA\d{4}',x[0]) or re.findall('^DA\d{4}',x[1]) or re.findall('^DA\d{4}',x[2]) else False, axis=1)]

已更新

        0       1       2
3  DA1234  CA1234  CA1234

输出

df.apply(lambda x: re.findall('^DA\d{4}',' '.join(list(x))), axis=1).any()[0]

答案 3 :(得分:0)

当您想在数据框中的任何位置搜索值时,可以调整值的形状以使其成为一个维系列:

s = pd.Series(df.values.reshape(len(df) * len(df.columns)))
s = s.loc[s.str.match(r'DA[0-9]{4}')]
if len(s) == 0:
    print('Not found')
else:
    print(s.iloc[0])

只需打印示例数据

DA1234