使用Pandas读取csv时如何将一系列列合并为一列?

时间:2019-06-26 12:07:22

标签: pandas dataframe

在读取带有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 |有趣|浪漫

,我用“-”分隔的内容应该是数据框的一列。

谢谢

2 个答案:

答案 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'])