我有一个看起来像的数据框df-

attribute_ids                     attributes_names
['adr4r','5ty6gh']                ['abc','xyz']
['fg67y','ty67g','ght43','adr4r'] ['pqr','abc','xyz','abc']


我想计算每个唯一atrribute_id存在的次数并按降序显示。但在结果中,我也想显示其相应的attribute_names。请注意,属性名称不是唯一的,attribute_id是。例如:adr4rty67g bith具有相同的名称“ abc”。输出应类似于-

attribute_ids       atribute_names     count
adr4r               abc                2
ty67g               abc                1
5ty6gh              xyz                1
ght43               xyz                1
fg67y               pqr                1


目前,我能够仅基于attribute_ids进行计数(无法显示相应的attribute_names):

count=df.attribute_ids.apply(pd.Series).stack().value_counts()

最佳答案

选项1
pir1


将列与np.concatenate连接在一起
使用np.unique标识唯一值,然后...


用参数return_counts=True计算这些值的出现
第一次出现的位置的索引,因此我可以使用参数names切片return_index=True





ids = np.concatenate(df.attribute_ids)
names = np.concatenate(df.attribute_names)

u, idx, cts = np.unique(ids, return_index=True, return_counts=True)

pd.DataFrame(dict(
    attribute_ids=u,
    attribute_names=names[idx],
    count=cts
))

  attribute_ids attribute_names  count
0        5ty6gh             xyz      1
1         adr4r             abc      2
2         fg67y             pqr      1
3         ght43             xyz      1
4         ty67g             abc      1




选项2
pir2


像选项1一样,我们将列展平
然后在attribute_ids列上使用分组,后跟agg




from cytools import concat

d1 = pd.DataFrame(dict(
    attribute_ids=list(concat(df.attribute_ids.values.tolist())),
    attribute_names=list(concat(df.attribute_names.values.tolist()))
))

d1.groupby('attribute_ids').attribute_names.agg(['first', 'count']) \
    .reset_index().rename(columns=dict(first='attribute_names'))

  attribute_ids attribute_names  count
0        5ty6gh             xyz      1
1         adr4r             abc      2
2         fg67y             pqr      1
3         ght43             xyz      1
4         ty67g             abc      1




选项3
pir3
在元组上使用pd.factorize。使用concat展平数组。

from cytoolz import concat

i = concat(df.attribute_ids.values.tolist())
n = concat(df.attribute_names.values.tolist())
f, u = pd.Series(list(zip(i, n))).factorize()
return pd.DataFrame(
    u.tolist(),
    columns=['attribute_ids', 'attribute_names']
).assign(count=np.bincount(f))

  attribute_ids attribute_names  count
0         adr4r             abc      2
1        5ty6gh             xyz      1
2         fg67y             pqr      1
3         ty67g             abc      1
4         ght43             xyz      1




定时

results.div(results.min(1), 0).round(2).pipe(lambda d: d.assign(Best=d.idxmin(1)))

        pir1  pir2  pir3  galt  Best
N
1       1.00  4.37  1.75  4.07  pir1
3       1.00  3.84  1.54  4.58  pir1
10      1.48  2.46  1.00  2.38  pir3
30      2.42  3.09  1.00  2.86  pir3
100     5.56  2.42  1.00  2.58  pir3
300    14.86  2.52  1.00  2.42  pir3
1000   24.63  1.37  1.00  1.43  pir3
3000   38.14  1.47  1.00  1.35  pir3
10000  41.85  1.36  1.00  1.14  pir3




fig, (a1, a2) = plt.subplots(1, 2, figsize=(6, 6))
results.plot(loglog=True, lw=3, ax=a1)
results.div(results.min(1), 0).round(2).plot.barh(logx=True, ax=a2)
fig.tight_layout()


python -  Pandas 数量异常-LMLPHP



def galt(df):
    cols = df.columns.tolist()
    return pd.DataFrame({
        c: [v for L in df[c] for v in L] for c in cols
    }).groupby(cols).size().reset_index(name='count')

def pir1(df):
    ids = np.concatenate(df.attribute_ids)
    names = np.concatenate(df.attribute_names)

    u, idx, cts = np.unique(ids, return_index=True, return_counts=True)

    return pd.DataFrame(dict(
        attribute_ids=u,
        attribute_names=names[idx],
        count=cts
    ))

def pir2(df):
    d1 = pd.DataFrame(dict(
        attribute_ids=list(concat(df.attribute_ids.values.tolist())),
        attribute_names=list(concat(df.attribute_names.values.tolist()))
    ))

    return d1.groupby('attribute_ids').attribute_names.agg(['first', 'count']) \
        .reset_index().rename(columns=dict(first='attribute_names'))

def pir3(df):
    i = concat(df.attribute_ids.values.tolist())
    n = concat(df.attribute_names.values.tolist())
    f, u = pd.Series(list(zip(i, n))).factorize()
    return pd.DataFrame(
        u.tolist(),
        columns=['attribute_ids', 'attribute_names']
    ).assign(count=np.bincount(f))


results = pd.DataFrame(
    index=pd.Index([1, 3, 10, 30, 100, 300, 1000, 3000, 10000], name='N'),
    columns='pir1 pir2 pir3 galt'.split(),
    dtype=float
)

for i in results.index:
    d = pd.concat([df] * i, ignore_index=True)
    for j in results.columns:
        stmt = '{}(d)'.format(j)
        setp = 'from __main__ import d, {}'.format(j)
        results.set_value(i, j, timeit(stmt, setp, number=10))




设定

df = pd.DataFrame(dict(
    attribute_ids=[['adr4r', '5ty6gh'], ['fg67y', 'ty67g', 'ght43', 'adr4r']],
    attribute_names=[['abc', 'xyz'], ['pqr', 'abc', 'xyz', 'abc']]
))

关于python - Pandas 数量异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45491020/

10-12 18:20