在Python中选择相似名称的列

1 投票
4 回答
1981 浏览
提问于 2025-04-17 22:47

我的数据框里有很多列,但有些列的名字开头是相似的:

>>> df.columns
Index([u'VESSELTYPE', u'VESSELNAME', u'PERIODSTART', u'PERIODEND', u'ESTREDELI', u'HIRE', u'DAYS Mar-14', u'DAYS Q2 2014', u'DAYS Q3 2014', u'DAYS Q4 2014', u'DAYS Q1 2015', u'DAYS Q2 2015', u'DAYS Q3 2015', u'DAYS Q4 2015', u'NUMDAYS'], dtype='object')
>>> 

你看,我想选择所有以'DAYS'开头的列,有没有什么方法像SQL那样,可以用*来表示'DAYS'后面的所有内容呢?

4 个回答

0

要获取你数据表中只有日期的那几列,可以这样做:

print df[[x for x in df.columns if "DAY" in x]]
0

是的,你可以试试这样做:

'DAYS' == x[:len('DAYS')]

这里你是在把目标字符串和前面 n 个字符进行比较。这里的 n 是你目标字符串的长度。

你可以在选择的时候使用这个条件。

1

pandas中的索引(和数据框)其实是numpy数组,所以你可以用numpy的一些索引技巧。特别是,用一个布尔值的向量来索引会很有帮助。要检查某个特定的条目是否以"DAYS"开头,可以使用Python的标准字符串方法;把这个放在列表推导式里,就能得到一个布尔值的列表:

df.columns[[x.startswith("DAYS") for x in df.columns]]

或者你可以在数组上使用map方法,这样就可以避免出现双重括号:

df.columns(df.columns.map(lambda x: x.startswith("DAYS"))
3

试着把这个调整到你的代码里。

l = ([u'VESSELTYPE', u'VESSELNAME', u'PERIODSTART', u'PERIODEND', u'ESTREDELI', u'HIRE', u'DAYS Mar-14', u'DAYS Q2 2014', u'DAYS Q3 2014', u'DAYS Q4 2014', u'DAYS Q1 2015', u'DAYS Q2 2015', u'DAYS Q3 2015', u'DAYS Q4 2015', u'NUMDAYS'], 'AnotherItem')

days = [s for s in l[0] if s.startswith('DAYS')]
print days

你可以使用所有字符串都有的"startswith()"方法,并用它来做一些逻辑判断。

如果你不喜欢列表推导式,这里有一个用for循环实现的等效写法:

days = []
for s in l[0]:
    if s.startswith('DAYS'):
        days.append(s)

print days

撰写回答