Python排序值并基于唯一键对其进行分组
我有一个元组元素列表,如下所示。我想将元素分组到多维行和多维列中。例如: 将列表称为“列表”: 我想将此列表打印为:Python排序值并基于唯一键对其进行分组,python,arrays,list,sorting,multiple-columns,Python,Arrays,List,Sorting,Multiple Columns,我有一个元组元素列表,如下所示。我想将元素分组到多维行和多维列中。例如: 将列表称为“列表”: 我想将此列表打印为: ------------------------------------------ Name | AlaskanAir | DeltaAir | DragonAir ------------------------------------------ Adam * Bianca * Romeo
------------------------------------------
Name | AlaskanAir | DeltaAir | DragonAir
------------------------------------------
Adam *
Bianca *
Romeo *
Danaerys *
Jon *
Walter *
------------------------------------------
我首先要做的是找到我想要作为行标题的所有唯一元素
row=[]
for i in list:
row.append(i[1])
row = list(set(row))
然后我将遍历“行”中的元素,然后构建表。我怎样才能轻松地构建它?
谢谢 我们可以使用
pandas
:
import pandas as pd
df = pd.DataFrame([("Adam", "DeltaAir"),
("Bianca", "AlaskanAir"),
("Romeo", "DeltaAir"),
("Danaerys", "DragonAir"),
("Jon", "DragonAir"),
("Walter", "AlaskanAir")], columns=['name', 'value'])
result = pd.get_dummies(df, columns=['value']).rename(columns={f'value_{col}': col for col in df['value'].unique()}).replace({col: {0: '', 1: '*'} for col in df['value'].unique()})
print(result)
输出:
name AlaskanAir DeltaAir DragonAir
0 Adam *
1 Bianca *
2 Romeo *
3 Danaerys *
4 Jon *
5 Walter *
这会在相关列中将对应于每个个体的值转换为1或0。然后,我们简单地用*
替换1,用空字符串替换0
请注意,pandas
对于逻辑不是必需的,这可以简单地完成,但它便于表的对齐
lst = [("Adam", "DeltaAir"),
("Bianca", "AlaskanAir"),
("Romeo", "DeltaAir"),
("Danaerys", "DragonAir"),
("Jon", "DragonAir"),
("Walter", "AlaskanAir")]
#Create pandas DataFrame with the names from the list
df = pd.DataFrame([elem[0] for elem in lst], columns=["Name"])
#Iterate over a set (unique values) of character properties (DeltaAir, AlaskanAir, DragonAir)
for elem in set([elem[1] for elem in lst]):
#make a list containing spaces or *'s for every character in the list
#depending on the property we are just iterating over and add that list
# as a column to the DataFrame
df[elem] = ["*" if item[1] == elem else " " for item in lst]
编辑您的评论:
您可以使用groupby和aggregate按名称获取值(如果这不是您的意思,请澄清)
添加更多信息
谢谢你,弗洛里安。我的意思是,如果有下面这样的重复名称,它应该适当地填充相应的航空公司行。例如:亚当和罗密欧出现两次会像,而不是为同一个名字有两个单独的行
[("Adam", "DeltaAir"),
("Bianca", "AlaskanAir"),
("Romeo", "DeltaAir"),
("Danaerys", "DragonAir"),
("Jon", "DragonAir"),
("Walter", "AlaskanAir"),
("Adam", "AlaskanAir"),
("Romeo", "DragonAir")]
------------------------------------------
Name | AlaskanAir | DeltaAir | DragonAir
------------------------------------------
Adam * *
Bianca *
Romeo * *
Danaerys *
Jon *
Walter *
------------------------------------------
df=pd.DataFrame([elem[7]表示计划中的元素),columns=[“Name”])-使此“[elem[7]表示计划中的元素]”列表仅显示唯一值的最佳方法是什么?例如:df=pd.DataFrame(set([elem[7]表示平面中的elem]),columns=[“Name”])我的意思是,您是否也可以使“Name”唯一,因此如果有两个Adams,则*落在相应的行中@Florian H.谢谢。在运行上述代码时,我也会收到此错误“raise KeyError”(“找不到列:%s”%key)。您确定这来自上述代码吗?你使用什么python版本?我想我在试图理解代码和重写时犯了一个错误。它在佛罗里达州工作得很好!
df.reindex(sorted(df.columns))
df2 = pd.DataFrame(sorted(list(df["Name"].unique())), columns = ["Name"])
for elem in set([elem[1] for elem in lst]):
df2[elem] = list(df.groupby(['Name'])[elem].agg(lambda x: "*" if "*" in x.values else " "))
[("Adam", "DeltaAir"),
("Bianca", "AlaskanAir"),
("Romeo", "DeltaAir"),
("Danaerys", "DragonAir"),
("Jon", "DragonAir"),
("Walter", "AlaskanAir"),
("Adam", "AlaskanAir"),
("Romeo", "DragonAir")]
------------------------------------------
Name | AlaskanAir | DeltaAir | DragonAir
------------------------------------------
Adam * *
Bianca *
Romeo * *
Danaerys *
Jon *
Walter *
------------------------------------------