Pandas конкатенация данных приводит к неоднозначности результатов в DataFrame - PullRequest
0 голосов
/ 30 марта 2020

Моя цель здесь - объединить несколько pandas фреймов данных в один фрейм данных в каждой итерации. Я беру таблицу и создаю с ней данные. здесь код с комментариями.

def visit_table_links():
    links = grab_initial_links()

    df_final = None
    for obi in links:

        resp = requests.get(obi[1])
        tree = html.fromstring(resp.content)

        dflist = []

        for attr in tree.xpath('//th[contains(normalize-space(text()),  "sometext")]/ancestor::table/tbody/tr'):
            population = attr.xpath('normalize-space(string(.//td[2]))')
            try:
                population = population.replace(',', '')
                population = int(population)
                year = attr.xpath('normalize-space(string(.//td[1]))')
                year = re.findall(r'\d+', year)
                year = ''.join(year)
                year = int(year)


                #appending a to a list, 3 values first two integer last is string
                dflist.append([year, population, obi[0]])

            except Exception as e:
                pass

        #creating a dataframe which works fine

        df = pd.DataFrame(dflist, columns = ['Year', 'Population', 'Municipality'])

        #first time df_final is none so just make first df = df_final
        #next time df_final is previous dataframe so concat with the new one

        if df_final != None:
            df_final = pd.concat(df_final, df)
        else:

            df_final = df


visit_table_links()

здесь - ближайшие кадры данных

1-й кадр данных

   Year  Population Municipality
0  1970       10193   Cape Coral
1  1980       32103   Cape Coral
2  1990       74991   Cape Coral
3  2000      102286   Cape Coral
4  2010      154305   Cape Coral
5  2018      189343   Cape Coral

2-й кадр данных

    Year  Population Municipality
0   1900         383   Clearwater
1   1910        1171   Clearwater
2   1920        2427   Clearwater
3   1930        7607   Clearwater
4   1940       10136   Clearwater
5   1950       15581   Clearwater
6   1960       34653   Clearwater
7   1970       52074   Clearwater
8   1980       85170   Clearwater
9   1990       98669   Clearwater
10  2000      108787   Clearwater
11  2010      107685   Clearwater
12  2018      116478   Clearwater

Попытка объединить их приводит к этой ошибке

ValueError                                Traceback (most recent call last)
<ipython-input-93-429ad4d9bce8> in <module>
     75 
     76 
---> 77 visit_table_links()
     78 
     79 

<ipython-input-93-429ad4d9bce8> in visit_table_links()
     62         print(df)
     63 
---> 64         if df_final != None:
     65             df_final = pd.concat(df_final, df)
     66         else:

/usr/local/lib/python3.6/dist-packages/pandas/core/generic.py in __nonzero__(self)
   1476         raise ValueError("The truth value of a {0} is ambiguous. "
   1477                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1478                          .format(self.__class__.__name__))
   1479 
   1480     __bool__ = __nonzero__

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Я искал много тем и исчерпал свои ресурсы, я новичок в pandas и не понимая, почему это происходит,

Сначала я подумал, что это из-за дублирующихся индексов, затем я сделал uuid.uuid4.int () в качестве индекса, используя df.set_index('ID', drop=True, inplace=True), все та же ошибка.

Любое руководство будет очень полезным, спасибо.

РЕДАКТИРОВАТЬ: 1

Извините за неясность, ошибка генерируется из

df_final = pd.concat(df_final, df)

когда я пытаюсь объединить текущий фрейм данных с предыдущим фреймом

Редактировать 2:

передал аргументы в виде списка

df_final = pd.concat([df_final, df])

все та же ошибка

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Вместо df_final != None, попробуйте использовать len(df_final) == 0.

Также в команде pd.concat попробуйте передать аргументы в виде списка, например df_final = pd.concat([df_final, df])

0 голосов
/ 30 марта 2020

Исходя из предположения Саджана о len(df_final) == 0

у меня возникла идея, какая разница, если изначально установить для значения df_final значение None или пустой кадр данных с такими же столбцами?

получается да

вот новый код

def visit_table_links():
    links = grab_initial_links()

    df_final = pd.DataFrame(columns=['Year', 'Population', 'Municipality'])
    for obi in links:
        resp = requests.get(obi[1])
        tree = html.fromstring(resp.content)

        dflist = []

        for attr in tree.xpath('//th[contains(normalize-space(text()),  "sometext")]/ancestor::table/tbody/tr'):
            population = attr.xpath('normalize-space(string(.//td[2]))')
            try:
                population = population.replace(',', '')
                population = int(population)
                year = attr.xpath('normalize-space(string(.//td[1]))')
                year = re.findall(r'\d+', year)
                year = ''.join(year)
                year = int(year)

                dflist.append([year, population, obi[0]])

            except Exception as e:
                pass

        df = pd.DataFrame(dflist, columns = ['Year', 'Population', 'Municipality'])

        df_final = pd.concat([df_final, df])

visit_table_links()

По некоторым причинам установка df_final = None заставляет pandas выдавать эту ошибку даже хотя в первой итерации я присваиваю df_final = df, когда df_final не равен

, поэтому на следующей итерации не должно иметь значения, что изначально df_final было

, по какой-то причине это имеет значение

, поэтому эта строка df_final = pd.DataFrame(columns=['Year', 'Population', 'Municipality']) вместо этого df_final = None устранила проблему.

вот объединенный фрейм данных

    Year Population   Municipality
0   1970      10193     Cape Coral
1   1980      32103     Cape Coral
2   1990      74991     Cape Coral
3   2000     102286     Cape Coral
4   2010     154305     Cape Coral
5   2018     189343     Cape Coral
0   1900        383     Clearwater
1   1910       1171     Clearwater
2   1920       2427     Clearwater
3   1930       7607     Clearwater
4   1940      10136     Clearwater
5   1950      15581     Clearwater
6   1960      34653     Clearwater
7   1970      52074     Clearwater
8   1980      85170     Clearwater
9   1990      98669     Clearwater
10  2000     108787     Clearwater
11  2010     107685     Clearwater
12  2018     116478     Clearwater
0   1970       1489  Coral Springs
1   1980      37349  Coral Springs
2   1990      79443  Coral Springs
3   2000     117549  Coral Springs
4   2010     121096  Coral Springs
5   2018     133507  Coral Springs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...