[英]Pandas: count unique value in each column, by looping through them?
我有一個非常大的數據幀,我想從每列生成唯一的值。 這只是一個樣本 - 總共有20多列。
CRASH_DT CRASH_MO_NO CRASH_DAY_NO
1/1/2013 01 01
1/1/2013 01 01
1/5/2013 03 05
我想要的輸出是這樣的:
<variable = "CRASH_DT">
<code>1/1/2013</code>
<count>2</count>
<code>1/5/2013</code>
<count>1</count>
</variable>
<variable = "CRASH_MO_NO">
<code>01</code>
<count>2</count>
<code>03</code>
<count>1</count>
</variable>
<variable = "CRASH_DAY_NO">
<code>01</code>
<count>2</count>
<code>05</code>
<count>1</count>
</variable>
我一直在嘗試使用.sum()或.unique()函數,正如我已經看過的關於這個主題的許多其他問題所建議的那樣。
它們似乎都不適用於這個問題,並且所有人都說為了從每一列生成唯一值,您應該使用groupby函數,或者選擇單個列。 我有非常多的專欄(超過20個),因此僅僅通過寫出df.unique ['col1','col2'...'col20'將它們組合在一起真的沒有意義
我試過.unique(),. value_counts()和.count,但是我無法弄清楚如何應用任何這些來跨多個列工作,而不是groupby函數或上面鏈接中建議的任何內容。
我的問題是:如何從真正龐大的數據幀中的每個列生成唯一值的計數,最好是通過循環遍歷列本身? (我很抱歉,如果這是重復的,我已經查看了很多關於這個主題的問題,雖然他們看起來也應該為我的問題工作,但我無法弄明白如何調整它們以使它們得到它們為我工作。)
到目前為止這是我的代碼:
import pyodbc
import pandas.io.sql
conn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\\Users\\<filename>.accdb')
sql_crash = "SELECT * FROM CRASH"
df_crash = pandas.io.sql.read_sql(sql_crash, conn)
df_c_head = df_crash.head()
df_c_desc = df_c_head.describe()
for k in df_c_desc:
df_c_unique = df_c_desc[k].unique()
print(df_c_unique.value_counts()) #Generates the error "numpy.ndarray object has no attribute .value_counts()
我會遍歷每列的value_counts().items()
:
>>> df["CRASH_DAY_NO"].value_counts()
01 2
05 1
dtype: int64
>>> df["CRASH_DAY_NO"].value_counts().items()
<zip object at 0x7fabf49f05c8>
>>> for value, count in df["CRASH_DAY_NO"].value_counts().items():
... print(value, count)
...
01 2
05 1
所以像
def vc_xml(df):
for col in df:
yield '<variable = "{}">'.format(col)
for k,v in df[col].value_counts().items():
yield " <code>{}</code>".format(k)
yield " <count>{}</count>".format(v)
yield '</variable>'
with open("out.xml", "w") as fp:
for line in vc_xml(df):
fp.write(line + "\n")
給我
<variable = "CRASH_DAY_NO">
<code>01</code>
<count>2</count>
<code>05</code>
<count>1</count>
</variable>
<variable = "CRASH_DT">
<code>1/1/2013</code>
<count>2</count>
<code>1/5/2013</code>
<count>1</count>
</variable>
<variable = "CRASH_MO_NO">
<code>01</code>
<count>2</count>
<code>03</code>
<count>1</count>
</variable>
這個答案的靈感來自於這個問題的答案。 但我不知道它是否足夠可擴展。
df = pd.DataFrame({'CRASH_DAY_NO': [1, 1, 5, 2, 2],
'CRASH_DT': ['10/2/2014 5:00:08 PM',
'5/28/2014 1:29:28 PM',
'5/28/2014 1:29:28 PM',
'7/14/2014 5:42:03 PM',
'6/3/2014 10:33:22 AM'],
'CRASH_ID': [1486150, 1486152, 1486224, 1486225, 1486226],
'SEG_PT_LRS_MEAS': [79.940226960000004,
297.80989999000002,
140.56460290999999,
759.43600000000004,
102.566036],
'SER_NO': [1, 3, 4, 5, 6]})
df = df.apply(lambda x: x.value_counts(sort=False))
df.index = df.index.astype(str)
# Transforming to XML by hand ...
def func(row):
xml = ['<variable = "{0}">'.format(row.name)]
for field in row.index:
if not pd.isnull(row[field]):
xml.append(' <code>{0}</code>'.format(field))
xml.append(' <count>{0}</count>'.format(row[field]))
xml.append('</variable>')
return '\n'.join(xml)
print('\n'.join(df.apply(func, axis=0)))
<variable = "CRASH_DAY_NO">
<code>1</code>
<count>2.0</count>
<code>2</code>
<count>2.0</count>
<code>5</code>
<count>1.0</count>
</variable>
<variable = "CRASH_DT">
<code>5/28/2014 1:29:28 PM</code>
<count>2.0</count>
<code>7/14/2014 5:42:03 PM</code>
<count>1.0</count>
<code>10/2/2014 5:00:08 PM</code>
<count>1.0</count>
<code>6/3/2014 10:33:22 AM</code>
<count>1.0</count>
</variable>
....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.