读取.csv文件并根据特定列中的相等值连接值

时间:2018-05-31 08:06:03

标签: python list csv

我有一个csv文件,它有三列(A,B和C),它们的值如下图所示: CSV Table

1,2,4
1,257,5
1,258,6
1,8,7
1,260,8
2,24,9
2,26,10
2,234,11
3,14,12
3,22,13
3,78,14

我想通过" - " 加入B列中的值,而A列中的值相同。因此,预期产出如下:

[" 2-257-258-8-260"," 24-26-234"," 14-22-78"]

任何人都可以帮助我如何获得这些结果。

提前致谢

3 个答案:

答案 0 :(得分:2)

这是一个简单的Python解决方案。

我们使用csv读者来读取数据。在我的代码中,我从名为file_data的行列表中读取,但您可以将file_data更改为打开的文件对象。

我们将数据存储到列表字典中,列A值作为键,列B值附加到列表中。

然后我们按顺序遍历键,将B数据连接成所需形式的字符串。

import csv
from collections import defaultdict

file_data = '''\
1,2,4
1,257,5
1,258,6
1,8,7
1,260,8
2,24,9
2,26,10
2,234,11
3,14,12
3,22,13
3,78,14
'''.splitlines()

reader = csv.reader(file_data)
data = defaultdict(list)
for a, b, c in reader:
    #print(a, b, c)
    data[a].append(b)

out = ['-'.join(data[k]) for k in sorted(data.keys())]
print(out)

<强>输出

['2-257-258-8-260', '24-26-234', '14-22-78']

答案 1 :(得分:2)

如果您的数据集采用以下格式:

A,B,C
1,2,4
1,257,5
1,258,6
1,8,7
1,260,8
2,24,9
2,26,10
2,234,11
3,14,12
3,22,13
3,78,14

您可以使用itertools.groupby()A列中的项目进行分组,然后加入B列中的元素:

from csv import reader
from itertools import groupby
from operator import itemgetter

with open('data.csv') as in_file:
    csv_reader = reader(in_file)

    # skip headers
    next(csv_reader)

    # sort data by A column, then C column
    sorted_data = sorted(csv_reader, key=itemgetter(0, 2))

    # group by A column, and join by B column
    grouped = ['-'.join(map(itemgetter(1), g)) for _, g in groupby(sorted_data, key=itemgetter(0))]
    print(grouped)

哪个输出:

['2-257-258-8-260', '24-26-234', '14-22-78']

注意:此解决方案在分组之前进行排序,以防数据尚未主要在列A上排序,其次在列C上排序。

答案 2 :(得分:1)

熊猫解决方案

尝试使用pandas groupby函数,然后使用pandas apply然后在其中编写'-',然后使用import pandas as pd df = pd.DataFrame({'A':[1,1,1,2,2,3,3], 'B': [124,456,465,46,35,53,33]}) print(df.groupby('A')['B'].apply(lambda x: '-'.join([str(i) for i in x.values])).tolist()) 加入新列表理解:

['124-456-465', '46-35', '53-33']

输出:

 private class MyDrawView extends View {
    Paint paint;
    Path mPath;

    public MyDrawView(Context context) {
        this(context, null);

    }

    public MyDrawView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        mPath = new Path();
        mPath.moveTo(200, 200);
        mPath.lineTo(200, 100);
        mPath.lineTo(600, 100);
        mPath.lineTo(600, 300);
        mPath.lineTo(300, 300);
        mPath.cubicTo(250, 270, 400, 170, 200, 200);

        paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(8);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setPathEffect(new CornerPathEffect(10));
        paint.setAntiAlias(true);


    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPath(mPath, paint);
        invalidate();
    }
}