使用pandas.read_csv为csv捕获pandas中的非互斥类别

时间:2014-10-30 21:36:33

标签: python pandas

我想要创建一个csv文件,其中第1列是索引,第2列是某些类别列表,例如,第1列是我认识的人,第2列是类型:(相对,朋友,专业知识)< / p>

但在某些情况下,某些人可能既是专业熟人又是朋友,或亲戚和朋友,甚至是三者。

有没有办法可以将这些数据存储在csv文件中,这样当我将它作为数据帧加载到pandas中时,我可以按相关,朋友或专业熟人对数据进行分组,允许双倍或三倍计数同一个人以及后来的计数和与此相关的东西?这是我的问题。我想知道如何处理这种情况。

INPUT示例:

查理是一位熟练的熟人和朋友

todd是亲戚和朋友

jess是一位熟练的熟人

汤姆是专业的熟人

示例输出:(通过运行dfFromCSV.groupby('type').size()

专业认识:3

朋友:2

亲戚:1

2 个答案:

答案 0 :(得分:1)

假设您的输入存储在名为df的数据框中,其格式如下:

person   type
john     friend+work
jack     work
judy     college
janet    friend+work
jean     friend

唯一的要求是你有一个分隔符,在这种情况下是'+'。你能做的是以下几点:

df['type'].str.split('+').str.join(sep='+').str.get_dummies(sep='+').sum(axis=0)

输出:

college    1
friend     3
work       3

您可以拥有任意数量的类别,无需事先了解它们。

答案 1 :(得分:0)

假设您的关系列表是详尽无遗的,您可以像这样强制执行:

import pandas
from io import StringIO

csvstring = StringIO("""\
relationship
charlie is a professional acquaintance and friend
todd is a relative and friend
jess is a professional acquaintance
tom is a professional acquaintance
""")

rtypes = [
    'professional acquaintance',
    'friend',
    'relative',
    'rival',
    'nemsis',
    'mortal enemy'
]

df = pandas.read_csv(csvstring)
for rt in rtypes:
    df[rt] = df['relationship'].apply(lambda x: int(rt in x))

df.select_dtypes(exclude=[object]).sum()

这给了我:

professional acquaintance    3
friend                       2
relative                     1
rival                        0
nemsis                       0
mortal enemy                 0
dtype: int64

请注意,您的示例中存在拼写错误,并且此方法无法捕获这些错误。