तो, मेरे पास एक सीएसवी है जिसे मैंने टर्मिनल के माध्यम से आयात किया है और इसमें निम्न शामिल हैं:

  • RIVER_ID (पूरे जल निकाय के लिए अद्वितीय नदी आईडी)
  • FEATURE_ID (सुविधा के लिए अद्वितीय आईडी)
  • मूल्य (नाम)
  • गिनती (नाम की गिनती)

मेरे पास नामों की सूची में कई मान थे और साथ ही एक अद्वितीय RIVER_ID में समूहीकृत सूची में कई FEATURE_ID मान थे। मैं मूल्य सूची को साफ करने में कामयाब रहा और अब मैं प्रत्येक FEATURE_ID को अपनी पंक्ति में विस्फोट करना चाहता हूं और RIVER_ID और इसके मूल्य को जोड़ना चाहता हूं। लेकिन विस्फोट () फ़ंक्शन मुझे अपेक्षित परिणाम नहीं दे रहा है। यह सिर्फ सूची में विस्फोट करता है लेकिन इसे ',' से अलग स्ट्रिंग के रूप में रखता है। मैं ऐसा इसलिए कर रहा हूं क्योंकि मैं रैखिक से बहुभुज स्रोत में नाम स्थानांतरित कर रहा था और प्रत्येक बहुभुज नदी कई अलग-अलग विशेषताओं (अद्वितीय FEATURE_IDs के साथ) से बनी है, लेकिन उनके पास एक RIVER_ID है जो उन सभी व्यक्तिगत विशेषताओं को एक नदी के रूप में चिह्नित करता है। मैं नाम को केवल कुछ विशेषताओं के साथ मिलाने में कामयाब रहा, इसलिए विचार RIVER_ID द्वारा समूहित करना है ताकि नाम को समान RIVER_ID के साथ अन्य सभी सुविधाओं में स्थानांतरित किया जा सके। इसलिए मैं मूल ज्यामिति को बिना घुले और समान रखना चाहता हूं।

import pandas as pd
from sys import argv

input = argv[1]
# izlaz = argv[2]

df = pd.read_csv(input)
with pd.option_context('display.max_rows', None, 'display.max_columns', None):  # more options can be specified also
    df_g = df.groupby(["HIDRO_ID"], as_index=False)[ 'value', 'count', 'HY_DTM_ID'].agg(lambda x: list(x))
    df_g['count'] = df_g.apply(lambda x: df_g['count'].max())

    i = 0
    for i, red in zip(range(0, len(df_g['value'])), df_g['value']):
        # print(red[0])
        # print(red)
        if len(red) > 1:
            if type(red[0]) == float:
                # print("Success")
                red[0] = red[1]
                red = red[0]
                # print(red)
                df_g['value'][i] = red

            elif type(red[-1]) == float:
                red[-1] = red[0]
                red = red[0]
                df_g['value'][i] = red
            i += 1

    df_final = df_g[['HIDRO_ID', 'value', 'count', 'HY_DTM_ID']]
    print(df_final.head(20))
    # print(df_g.explode('HY_DTM_ID'))
    df_final = df_g.explode('HY_DTM_ID')
    print(df_final.head(20))
    #
    #
    df_final.to_csv("river_names_changed.csv")

उदाहरण:

  • RIVER_ID = 3
  • FEATURE_ID = [४३९८२३, ४४८७६५, ४८७६५४]
  • मूल्य = [नैन, ​​डेन्यूब, डेन्यूब]

सफाई के बाद:

  • RIVER_ID = 3
  • FEATURE_ID = [४३९८२३, ४४८७६५, ४८७६५४]
  • मूल्य = [डेन्यूब]

विस्फोट के बाद ():

  • RIVER_ID = 3
  • FEATURE_ID = 439823, 448765, 487654
  • मान = डेन्यूब

विस्फोट के बाद इच्छा:

  • RIVER_ID = 3

  • FEATURE_ID = 439823

  • मान = डेन्यूब

  • RIVER_ID = 3

  • FEATURE_ID = 448765

  • मान = डेन्यूब

  • RIVER_ID = 3

  • FEATURE_ID = 487654

  • मान = डेन्यूब

आशा है कि यह काफी स्पष्ट कर रहा है।

1
Matija 31 अगस्त 2020, 09:43

1 उत्तर

सबसे बढ़िया उत्तर

कुछ टिप्पणी समस्या के बाद कॉलम में डेटा स्ट्रिंग था, सूचियां नहीं, इसलिए समाधान उन्हें विभाजक द्वारा विभाजित किया जाता है और वापस असाइन किया जाता है:

df_final['HY_DTM_ID'] = df_final['HY_DTM_ID'].str.split(",")
1
jezrael 31 अगस्त 2020, 10:29