如何合并同一数据帧的多行?或者如何在python中合并同一密钥对的多个值?

如何合并同一数据帧的多行?或者如何在python中合并同一密钥对的多个值?,python,pandas,list,dataframe,dictionary,Python,Pandas,List,Dataframe,Dictionary,如果我有这样一个数据,然后将其转换为数据帧,那么如何合并键值对以获得该数据帧 data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}] 这里有一种方法可以满足你的要求。我不知道为什么,确切地说,你会想要得到那个输出,但我相信你有一个很好的理由 df2现在看起来像这样: import pandas as pd data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':

如果我有这样一个数据,然后将其转换为数据帧,那么如何合并键值对以获得该数据帧

data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}]

这里有一种方法可以满足你的要求。我不知道为什么,确切地说,你会想要得到那个输出,但我相信你有一个很好的理由

df2现在看起来像这样:

import pandas as pd

data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}]

# Convert to Pandas DataFrame
df = pd.DataFrame(data)

# At first, your data look like this
print(df)
     a    b    c
0  1.0  NaN  NaN
1  NaN  3.0  NaN
2  NaN  4.0  NaN
3  NaN  5.0  NaN
4  NaN  NaN  5.0
5  NaN  NaN  5.0

# Now chain a few operations together:
# 1) "stack" the values to go from a "wide" data format to a "tall, narrow" format
# 2) reset the index so we have only columns, not a Pandas index
# 3) drop the first column (the old index) called "level_0"
df2 = df.stack().reset_index().drop(columns='level_0')

# Assign better names to the columns:
df2.columns = ('data_title', 'values')
现在要查找按每个
数据\u title
分组的唯一值:

print(df2)
  data_title  values
0          a     1.0
1          b     3.0
2          b     4.0
3          b     5.0
4          c     5.0
5          c     5.0
这样,每个“值”记录都是唯一值的Python
列表:

# Group by the "data_title" column, and find unique values from the "values" column
# Then reset the index again
df3 = df2.groupby('data_title')['values'].unique().reset_index()
然而,我认为更大的问题是,你到底想要实现什么?接下来呢?我猜如果我知道这个大问题的答案,我们可以走一条更直接的路线去你的目的地


这让我想起了一个笑话,在爱尔兰有人问如何去都柏林,那个人回答说:“我不会从这里开始的。”)

这里有一种方法可以满足你的要求。我不知道为什么,确切地说,你会想要得到那个输出,但我相信你有一个很好的理由

df2现在看起来像这样:

import pandas as pd

data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}]

# Convert to Pandas DataFrame
df = pd.DataFrame(data)

# At first, your data look like this
print(df)
     a    b    c
0  1.0  NaN  NaN
1  NaN  3.0  NaN
2  NaN  4.0  NaN
3  NaN  5.0  NaN
4  NaN  NaN  5.0
5  NaN  NaN  5.0

# Now chain a few operations together:
# 1) "stack" the values to go from a "wide" data format to a "tall, narrow" format
# 2) reset the index so we have only columns, not a Pandas index
# 3) drop the first column (the old index) called "level_0"
df2 = df.stack().reset_index().drop(columns='level_0')

# Assign better names to the columns:
df2.columns = ('data_title', 'values')
现在要查找按每个
数据\u title
分组的唯一值:

print(df2)
  data_title  values
0          a     1.0
1          b     3.0
2          b     4.0
3          b     5.0
4          c     5.0
5          c     5.0
这样,每个“值”记录都是唯一值的Python
列表:

# Group by the "data_title" column, and find unique values from the "values" column
# Then reset the index again
df3 = df2.groupby('data_title')['values'].unique().reset_index()
然而,我认为更大的问题是,你到底想要实现什么?接下来呢?我猜如果我知道这个大问题的答案,我们可以走一条更直接的路线去你的目的地


这让我想起了一个笑话,在爱尔兰有人问如何去都柏林,那个人回答说:“我不会从这里开始的。”)

我相信可能有比这更简单的方法,通过一些基本的列表理解,你也可以得到结果

print(df3)
  data_title           values
0          a            [1.0]
1          b  [3.0, 4.0, 5.0]
2          c            [5.0]

我相信可能有比这更简单的方法,通过一些基本的列表理解,你也可以得到结果

print(df3)
  data_title           values
0          a            [1.0]
1          b  [3.0, 4.0, 5.0]
2          c            [5.0]

首先,您需要去掉
NaN
值,因为这些值不允许您按所需方式组合数字:
T
将数据帧和交换列与行进行转换,
stack
将所有列放在一列中,创建多索引:

import pandas as pd

data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}]

data = {
    'data_title':[k for o in data for k in list(o.keys())],
    'value':[v for o in data for v in list(o.values())] 
}

df = pd.DataFrame(data)
df.groupby('data_title')['value'].unique().reset_index()
重置索引将允许您提取正确的列值

df2 = pd.DataFrame(df.T.stack()) 

        0
a   0   1.0
b   1   3.0
    2   4.0
    3   5.0
c   4   5.0
    5   5.0
因为您希望将值与
连接起来,
需要将类型转换为str。请注意
。astype(int)
将从值中删除
小数点

df2 = df2.reset_index()[['level_0', 0]]
现在,您可以使用
group_by
将列
0
中的唯一值放到
level_0
列中:

df2[0] = df2[0].astype(int).astype(str)

   level_0  0
0      a    1
1      b    3
2      b    4
3      b    5
4      c    5
5      c    5
由于在此阶段只有一列,df2将变成
系列
,我们需要将其转换回
数据帧
,并执行最终的
重置索引

df2 = df2.groupby(by='level_0', axis=0)[0].unique().apply(','.join)
从这里您可以更改列名,这应该与您想要的结果相匹配

df2 = pd.DataFrame(df2).reset_index()

    level_0 0
0      a    1
1      b    3,4,5
2      c    5

首先,您需要去掉
NaN
值,因为这些值不允许您按所需方式组合数字:
T
将数据帧和交换列与行进行转换,
stack
将所有列放在一列中,创建多索引:

import pandas as pd

data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}]

data = {
    'data_title':[k for o in data for k in list(o.keys())],
    'value':[v for o in data for v in list(o.values())] 
}

df = pd.DataFrame(data)
df.groupby('data_title')['value'].unique().reset_index()
重置索引将允许您提取正确的列值

df2 = pd.DataFrame(df.T.stack()) 

        0
a   0   1.0
b   1   3.0
    2   4.0
    3   5.0
c   4   5.0
    5   5.0
因为您希望将值与
连接起来,
需要将类型转换为str。请注意
。astype(int)
将从值中删除
小数点

df2 = df2.reset_index()[['level_0', 0]]
现在,您可以使用
group_by
将列
0
中的唯一值放到
level_0
列中:

df2[0] = df2[0].astype(int).astype(str)

   level_0  0
0      a    1
1      b    3
2      b    4
3      b    5
4      c    5
5      c    5
由于在此阶段只有一列,df2将变成
系列
,我们需要将其转换回
数据帧
,并执行最终的
重置索引

df2 = df2.groupby(by='level_0', axis=0)[0].unique().apply(','.join)
从这里您可以更改列名,这应该与您想要的结果相匹配

df2 = pd.DataFrame(df2).reset_index()

    level_0 0
0      a    1
1      b    3,4,5
2      c    5

下面的代码应该可以帮助您解决问题。如果需要聚合值列表,请选择选项2;如果需要聚合值字符串,请选择选项1

df2.rename(columns={'level_0':'data_title', 0:'values'}, inplace=True)
输出:

import pandas as pd

data = [{'a': 1}, {'b': 3}, {'b': 4}, {'b': 5}, {'c': 5}, {'c': 5}]

#converting list of Dict into dataframe
df = pd.DataFrame([(i, j) for a in data for i, j in a.items()],
                  columns=['data_title', 'values'])

#option 1 : for converting the aggregate column into a string of conc values
df_str = df.groupby('data_title').aggregate(
    lambda x: ', '.join(map(str, set(x)))).reset_index()

print(df_str)

#option 2 :  for converting the aggregate column into a list of conc values
df_aslist = df.groupby('data_title').aggregate(lambda x: list(x)).reset_index()

print(df_aslist)

下面的代码应该可以帮助您解决问题。如果需要聚合值列表,请选择选项2;如果需要聚合值字符串,请选择选项1

df2.rename(columns={'level_0':'data_title', 0:'values'}, inplace=True)
输出:

import pandas as pd

data = [{'a': 1}, {'b': 3}, {'b': 4}, {'b': 5}, {'c': 5}, {'c': 5}]

#converting list of Dict into dataframe
df = pd.DataFrame([(i, j) for a in data for i, j in a.items()],
                  columns=['data_title', 'values'])

#option 1 : for converting the aggregate column into a string of conc values
df_str = df.groupby('data_title').aggregate(
    lambda x: ', '.join(map(str, set(x)))).reset_index()

print(df_str)

#option 2 :  for converting the aggregate column into a list of conc values
df_aslist = df.groupby('data_title').aggregate(lambda x: list(x)).reset_index()

print(df_aslist)

尝试
data={'value':{'a':[0],'b':[1,2,3],'c':[4,5]}
data={'data\u title':['a','b','b','c','c'],'value':[1,3,4,5,5]
使用
gropby('data\u title')
只需通过执行一些循环魔术将数据转换为以下格式。尝试
data'a','value','c':[1,4,5],[c]}
data={'data\u title':['a','b','b','c','c','c'],'value':[1,3,4,5,5,5]}
使用
gropby('data\u title')
只需通过执行一些循环魔术将数据转换为以下格式即可。