Setting pandas.DataFrame string dtype (not file based)
<p>I'm having trouble with using <code>pandas.DataFrame</code>'s constructor and using the <code>dtype</code> argument. I'd like to preserve string values, but the following snippets always convert to a numeric type and then yield <code>NaN</code>s.</p>

<pre><code>from __future__ import unicode_literals
from __future__ import print_function


import numpy as np
import pandas as pd


def main():
    columns = ['great', 'good', 'average', 'bad', 'horrible']
    # minimal example, dates are coming (as strings) from some
    # non-file source.
    example_data = {
        'alice': ['', '', '', '2016-05-24', ''],
        'bob': ['', '2015-01-02', '', '', '2012-09-15'],
        'eve': ['2011-12-31', '', '1998-08-13', '', ''],
    }

    # first pass, yields dataframe full of NaNs
    df = pd.DataFrame(data=example_data, index=example_data.keys(),
        columns=columns, dtype=str) #or string, 'str', 'string', 'object'
    print(df.dtypes)
    print(df)
    print()

    # based on https://github.com/pydata/pandas/blob/master/pandas/core/frame.py
    # and https://github.com/pydata/pandas/blob/37f95cef85834207db0930e863341efb285e38a2/pandas/types/common.py
    # we're ultimately feeding dtype to numpy's dtype, so let's just use that:
    #     (using np.dtype('S10') and converting to str doesn't work either)
    df = pd.DataFrame(data=example_data, index=example_data.keys(),
        columns=columns, dtype=np.dtype('U'))
    print(df.dtypes)
    print(df) # still full of NaNs... =(



if __name__ == '__main__':
    main()
</code></pre>

<p>What value(s) of <code>dtypes</code> will preserve strings in the data frame?</p>

<p>for reference:</p>

<blockquote>
  <p>$ python --version</p>
  
  <p>2.7.12</p>
  
  <p>$ pip2 list | grep pandas</p>
  
  <p>pandas (0.18.1)</p>
  
  <p>$ pip2 list | grep numpy</p>
  
  <p>numpy (1.11.1)</p>
</blockquote>

<p>This is not a proper answer, but while you get one by someone else, I've noticed that using the <code>read_csv</code> function everything works.</p>

<p>So if you place your data in a <code>.csv</code> file called <code>myData.csv</code>, like this:</p>

<pre><code>great,good,average,bad,horrible
alice,,,,2016-05-24,
bob,,2015-01-02,,,2012-09-15
eve,2011-12-31,,1998-08-13,,
</code></pre>

<p>and do</p>

<pre><code>df = pd.read_csv('blablah/myData.csv')
</code></pre>

<p>it will keep the strings as they are!</p>

<pre><code>        great      good     average       bad      horrible
alice    NaN        NaN       NaN     2016-05-24      NaN
bob      NaN    2015-01-02    NaN         NaN     2012-09-15
eve   2011-12-31    NaN    1998-08-13     NaN         NaN
</code></pre>

<p>if you want, the empty values can be put as an space in the csv file or any other character/marker.</p>

python pandas numpy