使用列表列表在熊猫中创建DataFrame

时间:2019-12-22 16:52:06

标签: python python-3.x pandas

我有一个这样的列表清单。

 sports =  [['Sport', 'Country(s)'], ['Foot_ball', 'brazil'], ['Volleyball', 'Argentina', 'India'], ['Rugger', 'New_zealand', ‘South_africa’], ['Cricket', 'India'], ['Carrom', 'Uk', ‘Usa’], ['Chess', 'Uk']]

我要使用上述列表创建熊猫数据框,如下所示:

sport      Country(s)
Foot_ball      brazil
Volleyball     Argentina   
Volleyball     india
Rugger         New_zealnd  
Rugger         South_africa
Criket         India
Carrom         UK
Carrom         Usa
Chess          UK

我正尝试这样

sport_x = []
for x in sports[1:]:
    sport_x.append(x[0])
print(sport_x)

country = []
for y in sports[1:]:
    country.append(y[1:])

header = sports[0]

df = pd.DataFrame([sport_x,country], columns = header)

中途通过,我遇到此错误 但是我遇到了这个错误。

AssertionError: 2 columns passed, passed data had 6 columns

任何建议,如何执行。

2 个答案:

答案 0 :(得分:2)

类似的事情是首先“扩展”不规则形状的行,然后对其进行数据构图。

>>> sports = [
        ["Sport", "Country(s)"],
        ["Foot_ball", "brazil"],
        ["Volleyball", "Argentina", "India"],
        ["Rugger", "New_zealand", "South_africa"],
        ["Cricket", "India"],
        ["Carrom", "Uk", "Usa"],
        ["Chess", "Uk"],
    ]
>>> expanded_sports = []
>>> for row in sports:
...   for country in row[1:]:
...     expanded_sports.append((row[0], country))
...
>>> pd.DataFrame(expanded_sports[1:], columns=expanded_sports[0])
        Sport    Country(s)
0   Foot_ball        brazil
1  Volleyball     Argentina
2  Volleyball         India
3      Rugger   New_zealand
4      Rugger  South_africa
5     Cricket         India
6      Carrom            Uk
7      Carrom           Usa
8       Chess            Uk
>>>

EDIT :另一种使用.melt()的解决方案,但是对我来说这看起来很丑,而且顺序也不相同。

>>> pd.DataFrame(sports[1:]).melt(0, value_name='country').dropna().drop('variable', axis=1).rename({0: 'sport'}, axis=1)
         sport       country
0    Foot_ball        brazil
1   Volleyball     Argentina
2       Rugger   New_zealand
3      Cricket         India
4       Carrom            Uk
5        Chess            Uk
7   Volleyball         India
8       Rugger  South_africa
10      Carrom           Usa

答案 1 :(得分:1)

或者,熊猫使用explode并理解列表:

df=pd.DataFrame([[i[0],','.join(i[1:])] if len(i)>2 else i for i in sports[1:]],
         columns=sports[0])
df['Country(s)']=df['Country(s)'].str.split(',')
final=df.explode('Country(s)').reset_index(drop=True)

        Sport    Country(s)
0   Foot_ball        brazil
1  Volleyball     Argentina
2  Volleyball         India
3      Rugger   New_zealand
4      Rugger  South_africa
5     Cricket         India
6      Carrom            Uk
7      Carrom           Usa
8       Chess            Uk