给出如下数据框
A B C-1 D BTP Type C1 Type C2
0 0 1 0 0 0 NaN [Type B]
1 0 2 1 1 14 [Type B] [Type B]
2 0 3 2 2 28 [Type A] [Type B]
3 0 4 3 3 42 [Type A, Type B] [Type A, Type B]
4 0 5 4 4 56 [Type A] [Type A, Type B]
想为列Type A
取值为Type C1
的行,为列42
取BTP
的行,它们应返回行索引3。
尝试以下操作,但给出错误KeyError: False
df.loc[(df['BTP'] == 42) & ('Type A' in df['Type C1'])]
我最终想做的是获取符合上述条件的行(将是单行),并提取列B
和C-1
的值作为字典,例如{'B_val': 4, 'C_val': 3}
答案 0 :(得分:1)
使用Series.str.join
加入False
列中的列表,然后我们可以在此列上使用Series.str.contains
来检查给定的字符串Type C1
是否为是否存在于系列中,最后我们可以使用布尔值Type A
过滤数据帧的行:
mask
结果:
mask = df['BTP'].eq(42) & df['Type C1'].str.join('-').str.contains(r'\bType A\b')
df = df[mask]
答案 1 :(得分:1)
您可以使用
let format = DateFormatter()
format.dateFormat = "yyyy-MM-dd HH:mm:ss Z" // <- format of model.timestampName
let date = format.date(from: tryItNow)
答案 2 :(得分:0)
我用一个自定义函数解决了这个问题,它根据所考虑的列表是否包含'Type A',为每行返回一个True / False值列表。
# Check if elem is present in column 'col'
def has_elem(col, elem):
result = []
for c in col:
if elem in c:
result.append(True)
else:
result.append(False)
return result
# Filter
df.loc[(df['BTP'] == 42) & has_elem(df['Type_C1'], 'Type A'), :]
您的代码不起作用的原因是,第二个过滤器子句'Type A' in df['Type_C1']
在Series对象'Type A'
中查找字符串df['Type_C1']
的成员身份,并因此返回{{1} }。相反,您需要返回一个True / False值序列,数据框中的每一行返回1。