我正在尝试从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作为值来旋转数据,因为您看到索引列中的某些值会重复,但这不起作用。
答案 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 如果存在多个(在您的情况下都是)值,您将获得一个任意值。如果这是一个问题,请更新您的问题陈述,说明您希望如何处理该案例。