过滤数据

时间:2018-03-15 18:38:10

标签: python pandas

我正在尝试从pandas数据框中过滤掉值,然后生成包含这些值的列。在这里进一步澄清一个例子

print (temp.head())

Index  Work-Assigned  Location
  A         R            NL
  B         df           MB
  A                      NL
  C         SL           NL
  D         RC           MB
  A         RC           AB

现在我想做的是从这个数据帧中过滤掉所有R和SL值,并用这些值和索引创建另一个数据帧。像这样:

print (result.head())

Index    R/SL
  A       R
  B      
  C       SL
  D

我尝试使用Work-Assigned作为值来旋转数据,因为您看到索引列中的某些值会重复,但这不起作用。

2 个答案:

答案 0 :(得分:0)

我相信以下内容提供了所要求的输出:

# your original dataframe
df = pd.DataFrame({'Index': {0: 'A', 1: 'B', 2: 'A', 3: 'C', 4: 'D', 5: 'A'}, 'Location': {0: 'NL', 1: 'MB', 2: 'NL', 3: 'NL', 4: 'MB', 5: 'AB'}, 'Work-Assigned': {0: 'R', 1: 'df', 2: '', 3: 'SL', 4: 'RC', 5: 'RC'}}).set_index('Index').reindex(['Work-Assigned', 'Location'], axis=1)


df
Out[5]: 
      Work-Assigned Location
Index                       
A                 R       NL
B                df       MB
A                         NL
C                SL       NL
D                RC       MB
A                RC       AB

def some_filtering(df_, filter_values=['R', 'SL']):
    # use regex to create a Series which contains bool of whether any `filter_values` are found
    s_filter = df_['Work-Assigned'].str.extract('^({})$'.format('|'.join(filter_values)), expand=False)

    # if nothing was found then return a blank string; otherwise return the unique value found
    if s_filter.dropna().empty:
        val = ['']
    else:
        val = pd.unique(s_filter.dropna())

    # return a DataFrame containing the unique value found (could be blank) at the present index value passed to .groupby
    return pd.DataFrame(data=val, index=pd.unique(df_.index), columns=['/'.join(filter_values)])


df.groupby(level='Index', group_keys=False).apply(some_filtering)
Out[7]: 
  R/SL
A    R
B     
C   SL
D     

答案 1 :(得分:0)

IIUC,您希望按Index进行分组,并将值收集到set。然后在set查看值'R''SL'

假设您的DataFrame名为df,您可以执行以下操作:

'Index'分组,并将set构造函数应用于'Work-Assigned'列。这会将每个Index的所有不同值压缩为一行。

df2 = pd.DataFrame(df.groupby('Index')['Work-Assigned'].apply(set)).reset_index()
print(df2)
#  Index Work-Assigned
#0     A  {nan, R, RC}
#1     B          {df}
#2     C          {SL}
#3     D          {RC}

接下来检查每行的集合与您要搜索的值的交集。如果交集为空,则返回空字符串(如果您愿意,则返回np.nan)。否则,选择第一个值。 1

my_values = {'R', 'SL'}
df2['Work-Assigned'] = df2['Work-Assigned'].apply(
    lambda x: '' if not my_values.intersection(x) else list(my_values.intersection(x))[0]
)
print(df2)
#  Index Work-Assigned
#0     A             R
#1     B              
#2     C            SL
#3     D              

<强>参考

备注

1 如果存在多个(在您的情况下都是)值,您将获得一个任意值。如果这是一个问题,请更新您的问题陈述,说明您希望如何处理该案例。