在读取带有csv的csv时,我想选择特定的行,但是我也希望将最后5到8列保留为一列,因为在我的情况下它们都代表“流派”。
当尝试使用pd.read_csv bubt时,我尝试将标志usecols = [0,1,2,np.arange(5,8)]放置不起作用。
如果我使用标志usecols = [0,1,2,5],我只会在最后一列中获得一种类型,而其他类型(6、7、8)将会丢失。
我尝试了以下操作,但没有成功:
items = pd.read_csv(filename_item,
sep='|',
engine='python',
encoding='latin-1',
usecols=[0,1,2,np.arange(5,23)],
names=['movie_id', 'title', 'date','genres'])
我的CSV如下:
2 |石头的尖叫声(Schrei aus Stein)|(1991)| 1996年3月8日| dd | xx |戏剧| comedia |有趣|浪漫
我想得到:
2-石头的尖叫声(Schrei aus Stein)-(1991)-1996年3月8日-戏剧| comedia |有趣|浪漫
,我用“-”分隔的内容应该是数据框的一列。
谢谢
答案 0 :(得分:1)
您可能需要分两次通过。首先按原样阅读csv:
In[56]:
import pandas as pd
import io
t="""2|Scream of Stone (Schrei aus Stein)|(1991)|08-Mar-1996|dd|xx|drama|comedia|fun|romantic"""
df = pd.read_csv(io.StringIO(t), sep='|', usecols=[0,1,2,3,*np.arange(6,10)], header=None)
df
Out[56]:
0 1 2 3 6 7 \
0 2 Scream of Stone (Schrei aus Stein) (1991) 08-Mar-1996 drama comedia
8 9
0 fun romantic
然后我们可以使用apply
将所有流派结合在一起:
In[57]:
df['genres'] = df.iloc[:,4:].apply('|'.join,axis=1)
df
Out[57]:
0 1 2 3 6 7 \
0 2 Scream of Stone (Schrei aus Stein) (1991) 08-Mar-1996 drama comedia
8 9 genres
0 fun romantic drama|comedia|fun|romantic
答案 1 :(得分:0)
我的解决方案基于以下部分提出的一段代码: How to pre-process data before pandas.read_csv()
想法是编写一个“文件包装”类,该类可以传递 到 read_csv 。
class InFile(object):
def __init__(self, infile):
self.infile = open(infile)
def __next__(self):
return self.next()
def __iter__(self):
return self
def read(self, *args, **kwargs):
return self.__next__()
def next(self):
try:
line = self.infile.readline()
return re.sub('\|', ',', line, count=6)
except:
self.infile.close()
raise StopIteration
每个源行的重新格式化通过以下方式完成:
re.sub('\|', ',', line, count=6)
,前6个|
字符变为逗号,因此您可以阅读
没有sep='|'
。
要读取CSV文件,请运行:
df = pd.read_csv(InFile('Films.csv'), usecols=[0, 1, 2, 3, 6],
names=['movie_id', 'title', 'prod', 'date', 'genres'])