python - पंक्तियों को अनुक्रमित और सम्मिलित करते समय पंडों के डेटा फ्रेम के जोर से रोकें




pandas coercion (4)

कुछ खुदाई के बाद, यहाँ कुछ भयानक बदसूरत वर्कअराउंड हैं। (बेहतर उत्तर स्वीकार किया जाएगा।)

यहाँ पाया जाने वाला एक विचित्र यह है कि गैर-संख्यात्मक कॉलम जबरदस्ती बंद कर देता है, इसलिए यहां एक पंक्ति को एक dict अनुक्रमित करने का तरीका बताया गया है:

dict(df.assign(_='').loc[0].drop('_', axis=0))
# {'a': 1, 'b': 2.2}

और एक पंक्ति सम्मिलित करके एक नया डेटा फ्रेम एक पंक्ति के साथ बनाया जा सकता है:

df = df.append(pd.DataFrame({'a': 5, 'b': 4.4}, index=[1]))
print(df)
#    a    b
# 0  1  2.2
# 1  5  4.4

इन दोनों तरकीबों को बड़े डेटा फ्रेम के लिए अनुकूलित नहीं किया गया है, इसलिए मैं एक बेहतर उत्तर की सराहना करूंगा!

मैं पंडों के डेटा फ्रेम की अलग-अलग पंक्तियों के साथ काम कर रहा हूं, लेकिन पंक्तियों को अनुक्रमित और सम्मिलित करते समय मैं ज़बरदस्ती के मुद्दों पर ठोकर खा रहा हूं। लगता है कि पंडों को हमेशा एक मिश्रित इंट / फ्लोट से सभी-फ्लोट प्रकारों के साथ तालमेल करना चाहिए, और मैं इस व्यवहार पर कोई स्पष्ट नियंत्रण नहीं देख सकता हूं।

उदाहरण के लिए, यहाँ एक सरल डेटा फ्रेम है जिसमें int और b float रूप में है:

import pandas as pd
pd.__version__  # '0.25.2'

df = pd.DataFrame({'a': [1], 'b': [2.2]})
print(df)
#    a    b
# 0  1  2.2
print(df.dtypes)
# a      int64
# b    float64
# dtype: object

यहां एक पंक्ति को अनुक्रमित करते समय एक ज़बरदस्त मुद्दा है:

print(df.loc[0])
# a    1.0
# b    2.2
# Name: 0, dtype: float64
print(dict(df.loc[0]))
# {'a': 1.0, 'b': 2.2}

और यहाँ एक पंक्ति सम्मिलित करते समय एक ज़बरदस्त मुद्दा है:

df.loc[1] = {'a': 5, 'b': 4.4}
print(df)
#      a    b
# 0  1.0  2.2
# 1  5.0  4.4
print(df.dtypes)
# a    float64
# b    float64
# dtype: object

दोनों उदाहरणों में, मैं चाहता हूं कि a कॉलम एक पूर्णांक प्रकार के रूप में रहना चाहिए, बजाय एक फ्लोट प्रकार के लिए मजबूर होने के।


जब भी आप डेटाफ़्रेम या डेटा को डेटाफ़्रेम से जोड़ रहे हैं और डेटा को समान रखने की आवश्यकता है, तो अन्य आंतरिक संरचनाओं में रूपांतरण से बचें जो आवश्यक डेटा प्रकारों से अवगत नहीं हैं।

जब आप df.loc[0] करते हैं तो यह pd.Series परिवर्तित हो pd.Series ,

>>> type(df.loc[0])
<class 'pandas.core.series.Series'>

और अब, Series में केवल एक ही dtype । इस प्रकार float करने के लिए intercing int

इसके बजाय संरचना को pandas.pydata.org/pandas-docs/stable/reference/api/… रूप में pandas.pydata.org/pandas-docs/stable/reference/api/… ,

>>> type(df.loc[[0]])
<class 'pandas.core.frame.DataFrame'>

एक फ्रेम के रूप में आवश्यक पंक्ति का चयन करें और फिर dict परिवर्तित करें

>>> df.loc[[0]].to_dict(orient='records')
[{'a': 1, 'b': 2.2}]

इसी तरह, एक नई पंक्ति जोड़ने के लिए, पांडा pd.DataFrame.append फ़ंक्शन का उपयोग करें,

>>> df = df.append([{'a': 5, 'b': 4.4}]) # NOTE: To append as a row, use []
   a    b
0  1  2.2
0  5  4.4

उपरोक्त प्रकार से रूपांतरण नहीं होगा,

>>> df.dtypes
a      int64
b    float64
dtype: object

मामूली डेटा जोड़तोड़ के साथ एक अलग दृष्टिकोण:

मान लें कि आपके पास शब्दकोशों (या डेटाफ़्रेम) की एक सूची है

lod=[{'a': [1], 'b': [2.2]}, {'a': [5], 'b': [4.4]}]

जहां प्रत्येक शब्दकोश एक पंक्ति का प्रतिनिधित्व करता है (दूसरे शब्दकोश में सूचियों पर ध्यान दें)। फिर आप आसानी से एक डेटाफ्रेम बना सकते हैं:

pd.concat([pd.DataFrame(dct) for dct in lod])
   a    b
0  1  2.2
0  5  4.4

और आप स्तंभों के प्रकारों को बनाए रखते हैं। concat देखें

इसलिए यदि आपके पास डेटाफ़्रेम और डिसकस की सूची है, तो आप इसका उपयोग कर सकते हैं

pd.concat([df] + [pd.DataFrame(dct) for dct in lod])

समस्या की जड़ वह है

  1. पांडा डेटाफ्रेम का अनुक्रमण एक पांडा श्रृंखला देता है

हम देख सकते हैं कि:

type(df.loc[0])
# pandas.core.series.Series

और एक श्रृंखला में केवल एक dtype हो सकता है, आपके मामले में int64 या float64।

मेरे सिर पर दो वर्कअराउंड आते हैं:

print(df.loc[[0]])
# this will return a dataframe instead of series
# so the result will be
#    a    b
# 0  1  2.2

# but the dictionary is hard to read
print(dict(df.loc[[0]]))
# {'a': 0    1
# Name: a, dtype: int64, 'b': 0    2.2
# Name: b, dtype: float64}

या

print(df.astype(object).loc[0])
# this will change the type of value to object first and then print
# so the result will be
# a      1
# b    2.2
# Name: 0, dtype: object

print(dict(df.astype(object).loc[0]))
# in this way the dictionary is as expected
# {'a': 1, 'b': 2.2}
  1. जब आप किसी शब्दकोश को किसी डेटाफ़्रेम में जोड़ते हैं, तो वह शब्दकोश को पहले एक श्रृंखला में बदल देगा और फिर जोड़ देगा। (तो वही समस्या फिर से होती है)

https://github.com/pandas-dev/pandas/blob/master/pandas/core/frame.py#L6973

if isinstance(other, dict):
    other = Series(other)

तो आपका चलना वास्तव में एक ठोस है, या फिर हम कर सकते हैं:

df.append(pd.Series({'a': 5, 'b': 4.4}, dtype=object, name=1))
#    a    b
# 0  1  2.2
# 1  5  4.4




coercion