在 pandas 数据框单元格中插入列表
Insert list in pandas dataframe cell
我有一本字典,其中每个键都有一个值列表。
与每个键关联的列表的长度是不同的。
我想将字典转换为具有两列 'Key' 和 'Values' 的 pandas 数据框。每行在 'Key' 列中有一个字典键,在 'Values' 列中有与其关联的值列表。数据框将如下所示:
mapping_dict = {'A':['a', 'b', 'c', 'd'], 'B':['aa', 'bb', 'cc']}
df =
Key Value
0 A ['a', 'b', 'c', 'd']
1 B ['aa', 'bb', 'cc']
我尝试使用 here 提供的答案,根据我的用例对其进行修改。
但是没有输出要求的答案。
我想你可能需要事先更新你的字典然后你才能使用 from_dict。更新以使您的字典成为列表列表。
import pandas as pd
mapping_dict = {'A':['a', 'b', 'c', 'd'], 'B':['aa', 'bb', 'cc']}
updated_dict = {k: [v] for k, v in mapping_dict.items()}
df = pd.DataFrame.from_dict(updated_dict,orient='index')
如果您想要准确的格式
df_formatted = df.reset_index()
df_formatted.columns = ['Key', 'Value']
print(df_formatted)
Key Value
0 B [aa, bb, cc]
1 A [a, b, c, d]
更新
Bharath 的答案更短,但如果您仍想使用 from_dict,那么您可以采用他的部分方法来做
df2 = pd.DataFrame.from_dict(list(mapping_dict.items()))
df2.columns = ['Key', 'Value']
在构造函数中使用pd.Series
,因为dict值大小不相等,然后set_axis
添加列名即
mapping_dict = {'A':['a', 'b', 'c', 'd'], 'B':['aa', 'bb', 'cc']}
df = pd.DataFrame(pd.Series(mapping_dict).reset_index()).set_axis(['Key','Value'],1,inplace=False)
Key Value
0 A [a, b, c, d]
1 B [aa, bb, cc]
选项 2,将 dict 项转换为列表,然后将其传递给构造函数:
df = pd.DataFrame(list(mapping_dict.items()),columns=['Key','Value'])
如果您传递一个列表,pandas 会将其视为多行。但是,您可以通过将列表作为外部列表的单个元素来欺骗它,如下所示:
import pandas as pd
mapping_dict = {'A':[['a', 'b', 'c', 'd']], 'B':[['aa', 'bb', 'cc']]}
df = pd.DataFrame(mapping_dict)
df
A B
0 [a, b, c, d] [aa, bb, cc]
我必须在特定位置插入列表,以下解决方案对我有用。
出于某种原因,pandas 在应用函数中返回 list/array 时不会抱怨,所以:
df.loc[0,'A'] = df.loc[0,A].apply(lambda x: ['a', 'b', 'c', 'd'])
您只需使用 pandas 中的“at”setter 即可:
df.at[0,'A'] = ['a', 'b', 'c', 'd']
如果列 dtype 是“object”则有效。
我有一本字典,其中每个键都有一个值列表。 与每个键关联的列表的长度是不同的。 我想将字典转换为具有两列 'Key' 和 'Values' 的 pandas 数据框。每行在 'Key' 列中有一个字典键,在 'Values' 列中有与其关联的值列表。数据框将如下所示:
mapping_dict = {'A':['a', 'b', 'c', 'd'], 'B':['aa', 'bb', 'cc']}
df =
Key Value
0 A ['a', 'b', 'c', 'd']
1 B ['aa', 'bb', 'cc']
我尝试使用 here 提供的答案,根据我的用例对其进行修改。 但是没有输出要求的答案。
我想你可能需要事先更新你的字典然后你才能使用 from_dict。更新以使您的字典成为列表列表。
import pandas as pd
mapping_dict = {'A':['a', 'b', 'c', 'd'], 'B':['aa', 'bb', 'cc']}
updated_dict = {k: [v] for k, v in mapping_dict.items()}
df = pd.DataFrame.from_dict(updated_dict,orient='index')
如果您想要准确的格式
df_formatted = df.reset_index()
df_formatted.columns = ['Key', 'Value']
print(df_formatted)
Key Value
0 B [aa, bb, cc]
1 A [a, b, c, d]
更新
Bharath 的答案更短,但如果您仍想使用 from_dict,那么您可以采用他的部分方法来做
df2 = pd.DataFrame.from_dict(list(mapping_dict.items()))
df2.columns = ['Key', 'Value']
在构造函数中使用pd.Series
,因为dict值大小不相等,然后set_axis
添加列名即
mapping_dict = {'A':['a', 'b', 'c', 'd'], 'B':['aa', 'bb', 'cc']}
df = pd.DataFrame(pd.Series(mapping_dict).reset_index()).set_axis(['Key','Value'],1,inplace=False)
Key Value
0 A [a, b, c, d]
1 B [aa, bb, cc]
选项 2,将 dict 项转换为列表,然后将其传递给构造函数:
df = pd.DataFrame(list(mapping_dict.items()),columns=['Key','Value'])
如果您传递一个列表,pandas 会将其视为多行。但是,您可以通过将列表作为外部列表的单个元素来欺骗它,如下所示:
import pandas as pd
mapping_dict = {'A':[['a', 'b', 'c', 'd']], 'B':[['aa', 'bb', 'cc']]}
df = pd.DataFrame(mapping_dict)
df
A B
0 [a, b, c, d] [aa, bb, cc]
我必须在特定位置插入列表,以下解决方案对我有用。
出于某种原因,pandas 在应用函数中返回 list/array 时不会抱怨,所以:
df.loc[0,'A'] = df.loc[0,A].apply(lambda x: ['a', 'b', 'c', 'd'])
您只需使用 pandas 中的“at”setter 即可:
df.at[0,'A'] = ['a', 'b', 'c', 'd']
如果列 dtype 是“object”则有效。